From 0188d2367bd5798af84d1cf78bb3438acb7615ee Mon Sep 17 00:00:00 2001 From: Fangyin Cheng Date: Fri, 30 May 2025 23:43:22 +0800 Subject: [PATCH] feat(model): Support Qwen2.5 VL models (#2743) --- packages/dbgpt-core/pyproject.toml | 3 + .../src/dbgpt/model/adapter/hf_adapter.py | 59 +++++++++++++++++++ .../datasource/test_conn_mysql.py | 28 ++++----- .../datasource/test_conn_oracle.py | 2 +- uv.lock | 39 ++++++------ 5 files changed, 99 insertions(+), 32 deletions(-) diff --git a/packages/dbgpt-core/pyproject.toml b/packages/dbgpt-core/pyproject.toml index f48331c83..341262994 100644 --- a/packages/dbgpt-core/pyproject.toml +++ b/packages/dbgpt-core/pyproject.toml @@ -157,6 +157,9 @@ hf_kimi = [ hf_qwen3 = [ "transformers>=4.51.0", ] +hf_qwen2vl = [ + "transformers>=4.34.0", +] [build-system] requires = ["hatchling"] diff --git a/packages/dbgpt-core/src/dbgpt/model/adapter/hf_adapter.py b/packages/dbgpt-core/src/dbgpt/model/adapter/hf_adapter.py index 8af00b1db..0c35c822e 100644 --- a/packages/dbgpt-core/src/dbgpt/model/adapter/hf_adapter.py +++ b/packages/dbgpt-core/src/dbgpt/model/adapter/hf_adapter.py @@ -553,6 +553,7 @@ class QwenAdapter(NewHFChatModelAdapter): and "1.5" in lower_model_name_or_path and "moe" not in lower_model_name_or_path and "qwen2" not in lower_model_name_or_path + and "vl" not in lower_model_name_or_path ) @@ -565,10 +566,12 @@ class Qwen2Adapter(QwenAdapter): ( "qwen2" in lower_model_name_or_path and "instruct" in lower_model_name_or_path + and "vl" not in lower_model_name_or_path ) or ( "qwen2.5" in lower_model_name_or_path and "instruct" in lower_model_name_or_path + and "vl" not in lower_model_name_or_path ) ) @@ -608,6 +611,7 @@ class Qwen3Adapter(QwenAdapter): return lower_model_name_or_path and ( "qwen3" in lower_model_name_or_path and "base" not in lower_model_name_or_path + and "vl" not in lower_model_name_or_path ) def check_transformer_version(self, current_version: str) -> None: @@ -664,6 +668,60 @@ class Qwen3Adapter(QwenAdapter): return str_prompt +class Qwen2VLAdapter(NewHFChatModelAdapter): + def check_transformer_version(self, current_version: str) -> None: + if not current_version >= "4.37.0": + raise ValueError( + "Qwen2.5VL model require transformers.__version__>=4.37.0, please " + "upgrade your transformers package." + ) + + def do_match(self, lower_model_name_or_path: Optional[str] = None): + return ( + lower_model_name_or_path + and "qwen2" in lower_model_name_or_path + and "vl" in lower_model_name_or_path + and "instruct" in lower_model_name_or_path + ) + + def load(self, model_path: str, from_pretrained_kwargs: dict): + try: + from transformers import ( + Qwen2_5_VLForConditionalGeneration, + ) + except ImportError as exc: + raise ValueError( + "Could not import qwen2.5 vl model, please upgrade your " + "transformers package to 4.37.0 or later." + ) from exc + + logger.info( + f"Load model from {model_path}, from_pretrained_kwargs: " + f"{from_pretrained_kwargs}" + ) + + revision = from_pretrained_kwargs.get("revision", "main") + trust_remote_code = from_pretrained_kwargs.get( + "trust_remote_code", self.trust_remote_code + ) + low_cpu_mem_usage = from_pretrained_kwargs.get("low_cpu_mem_usage", False) + if "trust_remote_code" not in from_pretrained_kwargs: + from_pretrained_kwargs["trust_remote_code"] = trust_remote_code + if "low_cpu_mem_usage" not in from_pretrained_kwargs: + from_pretrained_kwargs["low_cpu_mem_usage"] = low_cpu_mem_usage + + tokenizer = self.load_tokenizer( + model_path, + revision, + use_fast=self.use_fast_tokenizer(), + trust_remote_code=trust_remote_code, + ) + model = Qwen2_5_VLForConditionalGeneration.from_pretrained( + model_path, **from_pretrained_kwargs + ) + return model, tokenizer + + class QwenOmniAdapter(NewHFChatModelAdapter): def do_match(self, lower_model_name_or_path: Optional[str] = None): return lower_model_name_or_path and ( @@ -1075,6 +1133,7 @@ register_model_adapter(GLM4Adapter, supported_models=COMMON_HF_GLM_MODELS) register_model_adapter(GLM40414Adapter) register_model_adapter(Codegeex4Adapter) register_model_adapter(Qwen2Adapter, supported_models=COMMON_HF_QWEN25_MODELS) +register_model_adapter(Qwen2VLAdapter) register_model_adapter(Internlm2Adapter) register_model_adapter(DeepseekV3R1Adapter, supported_models=COMMON_HF_DEEPSEEK__MODELS) register_model_adapter(KimiVLAdapter) diff --git a/tests/intetration_tests/datasource/test_conn_mysql.py b/tests/intetration_tests/datasource/test_conn_mysql.py index e7584fe57..7965d6613 100644 --- a/tests/intetration_tests/datasource/test_conn_mysql.py +++ b/tests/intetration_tests/datasource/test_conn_mysql.py @@ -1,21 +1,21 @@ """ - Run unit test with command: pytest dbgpt/datasource/rdbms/tests/test_conn_mysql.py - docker run -itd --name mysql-test -p 3307:3306 -e MYSQL_ROOT_PASSWORD=12345678 mysql:5.7 - mysql -h 127.0.0.1 -uroot -p -P3307 - Enter password: - Welcome to the MySQL monitor. Commands end with ; or \g. - Your MySQL connection id is 2 - Server version: 5.7.41 MySQL Community Server (GPL) +Run unit test with command: pytest dbgpt/datasource/rdbms/tests/test_conn_mysql.py +docker run -itd --name mysql-test -p 3307:3306 -e MYSQL_ROOT_PASSWORD=12345678 mysql:5.7 +mysql -h 127.0.0.1 -uroot -p -P3307 +Enter password: +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.41 MySQL Community Server (GPL) - Copyright (c) 2000, 2023, Oracle and/or its affiliates. +Copyright (c) 2000, 2023, Oracle and/or its affiliates. - Oracle is a registered trademark of Oracle Corporation and/or its - affiliates. Other names may be trademarks of their respective - owners. +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. - Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. - - > create database test; +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +> create database test; """ import pytest diff --git a/tests/intetration_tests/datasource/test_conn_oracle.py b/tests/intetration_tests/datasource/test_conn_oracle.py index 2193977ff..adb7288ca 100644 --- a/tests/intetration_tests/datasource/test_conn_oracle.py +++ b/tests/intetration_tests/datasource/test_conn_oracle.py @@ -116,4 +116,4 @@ def test_get_database_lists(db): pdb_names = [name[0] for name in databases[1:]] else: pdb_names = ["ORCL"] - assert any(name in ("ORCLPDB", "ORCL") for name in pdb_names) \ No newline at end of file + assert any(name in ("ORCLPDB", "ORCL") for name in pdb_names) diff --git a/uv.lock b/uv.lock index da694af85..365e403e2 100644 --- a/uv.lock +++ b/uv.lock @@ -3671,6 +3671,10 @@ hf-kimi = [ { name = "tiktoken" }, { name = "transformers", version = "4.51.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } }, ] +hf-qwen2vl = [ + { name = "transformers", version = "4.51.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "(extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cpu') or (extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cuda118') or (extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cuda121') or (extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra == 'extra-14-dbgpt-acc-auto-cpu' and extra == 'extra-14-dbgpt-acc-auto-cuda118') or (extra == 'extra-14-dbgpt-acc-auto-cpu' and extra == 'extra-14-dbgpt-acc-auto-cuda121') or (extra == 'extra-14-dbgpt-acc-auto-cpu' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra == 'extra-14-dbgpt-acc-auto-cuda118' and extra == 'extra-14-dbgpt-acc-auto-cuda121') or (extra == 'extra-14-dbgpt-acc-auto-cuda118' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra == 'extra-14-dbgpt-acc-auto-cuda121' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra != 'extra-14-dbgpt-acc-auto-cuda124' and extra == 'extra-5-dbgpt-hf-kimi') or (extra != 'extra-14-dbgpt-acc-auto-auto' and extra != 'extra-14-dbgpt-acc-auto-cpu' and extra != 'extra-14-dbgpt-acc-auto-cuda118' and extra != 'extra-14-dbgpt-acc-auto-cuda121' and extra == 'extra-5-dbgpt-hf-kimi')" }, + { name = "transformers", version = "4.51.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "(extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cpu') or (extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cuda118') or (extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cuda121') or (extra == 'extra-14-dbgpt-acc-auto-auto' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra == 'extra-14-dbgpt-acc-auto-cpu' and extra == 'extra-14-dbgpt-acc-auto-cuda118') or (extra == 'extra-14-dbgpt-acc-auto-cpu' and extra == 'extra-14-dbgpt-acc-auto-cuda121') or (extra == 'extra-14-dbgpt-acc-auto-cpu' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra == 'extra-14-dbgpt-acc-auto-cuda118' and extra == 'extra-14-dbgpt-acc-auto-cuda121') or (extra == 'extra-14-dbgpt-acc-auto-cuda118' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra == 'extra-14-dbgpt-acc-auto-cuda121' and extra == 'extra-14-dbgpt-acc-auto-cuda124') or (extra != 'extra-14-dbgpt-acc-auto-cuda124' and extra == 'extra-5-dbgpt-hf-glm4') or (extra != 'extra-14-dbgpt-acc-auto-cuda124' and extra != 'extra-5-dbgpt-hf-kimi') or (extra != 'extra-14-dbgpt-acc-auto-cuda124' and extra == 'extra-5-dbgpt-hf-kimi' and extra == 'extra-5-dbgpt-hf-qwen-omni') or (extra != 'extra-14-dbgpt-acc-auto-cuda124' and extra == 'extra-5-dbgpt-hf-kimi' and extra == 'extra-5-dbgpt-hf-qwen3') or (extra != 'extra-14-dbgpt-acc-auto-auto' and extra != 'extra-14-dbgpt-acc-auto-cpu' and extra != 'extra-14-dbgpt-acc-auto-cuda118' and extra != 'extra-14-dbgpt-acc-auto-cuda121' and extra == 'extra-5-dbgpt-hf-glm4') or (extra != 'extra-14-dbgpt-acc-auto-auto' and extra != 'extra-14-dbgpt-acc-auto-cpu' and extra != 'extra-14-dbgpt-acc-auto-cuda118' and extra != 'extra-14-dbgpt-acc-auto-cuda121' and extra != 'extra-5-dbgpt-hf-kimi') or (extra != 'extra-14-dbgpt-acc-auto-auto' and extra != 'extra-14-dbgpt-acc-auto-cpu' and extra != 'extra-14-dbgpt-acc-auto-cuda118' and extra != 'extra-14-dbgpt-acc-auto-cuda121' and extra == 'extra-5-dbgpt-hf-kimi' and extra == 'extra-5-dbgpt-hf-qwen-omni') or (extra != 'extra-14-dbgpt-acc-auto-auto' and extra != 'extra-14-dbgpt-acc-auto-cpu' and extra != 'extra-14-dbgpt-acc-auto-cuda118' and extra != 'extra-14-dbgpt-acc-auto-cuda121' and extra == 'extra-5-dbgpt-hf-kimi' and extra == 'extra-5-dbgpt-hf-qwen3')" }, +] hf-qwen3 = [ { name = "transformers", version = "4.51.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } }, ] @@ -3796,6 +3800,7 @@ requires-dist = [ { name = "transformers", marker = "extra == 'hf'", specifier = ">=4.46.0" }, { name = "transformers", marker = "extra == 'hf-glm4'", specifier = ">=4.51.3" }, { name = "transformers", marker = "extra == 'hf-kimi'", specifier = "<4.51.3" }, + { name = "transformers", marker = "extra == 'hf-qwen2vl'", specifier = ">=4.34.0" }, { name = "transformers", marker = "extra == 'hf-qwen3'", specifier = ">=4.51.0" }, { name = "typeguard" }, { name = "typing-inspect" }, @@ -3803,7 +3808,7 @@ requires-dist = [ { name = "xlrd", marker = "extra == 'framework'", specifier = "==2.0.1" }, { name = "zhipuai", marker = "extra == 'proxy-zhipuai'", specifier = ">=2.1.5" }, ] -provides-extras = ["client", "cli", "agent", "simple-framework", "framework", "hf", "code", "llama-cpp", "llama-cpp-server", "proxy-ollama", "proxy-zhipuai", "proxy-tongyi", "proxy-qianfan", "proxy-openai", "proxy-anthropic", "model-vl", "hf-qwen-omni", "hf-glm4", "hf-kimi", "hf-qwen3"] +provides-extras = ["client", "cli", "agent", "simple-framework", "framework", "hf", "code", "llama-cpp", "llama-cpp-server", "proxy-ollama", "proxy-zhipuai", "proxy-tongyi", "proxy-qianfan", "proxy-openai", "proxy-anthropic", "model-vl", "hf-qwen-omni", "hf-glm4", "hf-kimi", "hf-qwen3", "hf-qwen2vl"] [package.metadata.requires-dev] dev = [] @@ -10929,23 +10934,23 @@ dependencies = [ { name = "cymem" }, { name = "murmurhash" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/4e/76dbf784e7d4ed069f91a4c249b1d6ec6856ef0c0b2fd96992895d458b15/preshed-3.0.9.tar.gz", hash = "sha256:721863c5244ffcd2651ad0928951a2c7c77b102f4e11a251ad85d37ee7621660" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/4e/76dbf784e7d4ed069f91a4c249b1d6ec6856ef0c0b2fd96992895d458b15/preshed-3.0.9.tar.gz", hash = "sha256:721863c5244ffcd2651ad0928951a2c7c77b102f4e11a251ad85d37ee7621660", size = 14478 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/7f/a7d3eeaee67ecebbe51866c1aae6310e34cefa0a64821aed963a0a167b51/preshed-3.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f96ef4caf9847b2bb9868574dcbe2496f974e41c2b83d6621c24fb4c3fc57e3" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/4e/f251271ee9f0e0eb0ebe219a8df57ff8511a3b7a83e79e24d37105034164/preshed-3.0.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a61302cf8bd30568631adcdaf9e6b21d40491bd89ba8ebf67324f98b6c2a2c05" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/8b/6c8a153ea39b4750c20ed48dd9be4bf9d8c0b4e7822fc63c68cd2891703d/preshed-3.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99499e8a58f58949d3f591295a97bca4e197066049c96f5d34944dd21a497193" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/59/8f65ad22c13020ff281529e415c32a56cfa691d24b0eca2eb3d756e4d644/preshed-3.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea6b6566997dc3acd8c6ee11a89539ac85c77275b4dcefb2dc746d11053a5af8" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/72/108426ca3b6e7f16db30b3b9396e3fa45a3fd5a76f6532ab04beada2e4e3/preshed-3.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:bfd523085a84b1338ff18f61538e1cfcdedc4b9e76002589a301c364d19a2e36" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/1e/05fa559f53b635d96b233b63e93accb75215025b997486f7290991bec6c3/preshed-3.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7c2364da27f2875524ce1ca754dc071515a9ad26eb5def4c7e69129a13c9a59" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/b3/1a73ba16bab53043fd19dd0a7838ae05c705dccb329404dd4ad5925767f1/preshed-3.0.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182138033c0730c683a6d97e567ceb8a3e83f3bff5704f300d582238dbd384b3" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/9a/919d3708f6fa98d9eab1a186e6b30ab25a4595907bbc1fea5c1e8faa9b9d/preshed-3.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:345a10be3b86bcc6c0591d343a6dc2bfd86aa6838c30ced4256dfcfa836c3a64" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/69/d9ab108dc670b5be9e292bbd555f39e6eb0a4baab25cd28f792850d5e65b/preshed-3.0.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51d0192274aa061699b284f9fd08416065348edbafd64840c3889617ee1609de" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/fc/78cdbdb79f5d6d45949e72c32445d6c060977ad50a1dcfc0392622165f7c/preshed-3.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:96b857d7a62cbccc3845ac8c41fd23addf052821be4eb987f2eb0da3d8745aa1" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/7e/a41595876f644d8bd2c3d5422d7211e876b1848a8cc0c03cce33d9cd048a/preshed-3.0.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4fe6720012c62e6d550d6a5c1c7ad88cacef8388d186dad4bafea4140d9d198" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/68/1b4772ff3232e71b63a9206936eb1f75e976ebf4e4e24dc9b3ea7b68369b/preshed-3.0.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e04f05758875be9751e483bd3c519c22b00d3b07f5a64441ec328bb9e3c03700" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/52/48eefe876a3841c5850bd955daf145d0e408567c8f46a997bce136dc259d/preshed-3.0.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a55091d0e395f1fdb62ab43401bb9f8b46c7d7794d5b071813c29dc1ab22fd0" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/ea/9e6c1a7b1d623f6340379290d603a3b8a71ce52a93f842fbf7547f7f1812/preshed-3.0.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de8f5138bcac7870424e09684dc3dd33c8e30e81b269f6c9ede3d8c7bb8e257" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/e4/d074efb7e8a8873d346d2fb8dd43e19b1eae0697351c0d79cff947cba46e/preshed-3.0.9-cp312-cp312-win_amd64.whl", hash = "sha256:24229c77364628743bc29c5620c5d6607ed104f0e02ae31f8a030f99a78a5ceb" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/7f/a7d3eeaee67ecebbe51866c1aae6310e34cefa0a64821aed963a0a167b51/preshed-3.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f96ef4caf9847b2bb9868574dcbe2496f974e41c2b83d6621c24fb4c3fc57e3", size = 132225 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/4e/f251271ee9f0e0eb0ebe219a8df57ff8511a3b7a83e79e24d37105034164/preshed-3.0.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a61302cf8bd30568631adcdaf9e6b21d40491bd89ba8ebf67324f98b6c2a2c05", size = 127791 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/8b/6c8a153ea39b4750c20ed48dd9be4bf9d8c0b4e7822fc63c68cd2891703d/preshed-3.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99499e8a58f58949d3f591295a97bca4e197066049c96f5d34944dd21a497193", size = 150279 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/59/8f65ad22c13020ff281529e415c32a56cfa691d24b0eca2eb3d756e4d644/preshed-3.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea6b6566997dc3acd8c6ee11a89539ac85c77275b4dcefb2dc746d11053a5af8", size = 156914 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/72/108426ca3b6e7f16db30b3b9396e3fa45a3fd5a76f6532ab04beada2e4e3/preshed-3.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:bfd523085a84b1338ff18f61538e1cfcdedc4b9e76002589a301c364d19a2e36", size = 122224 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/1e/05fa559f53b635d96b233b63e93accb75215025b997486f7290991bec6c3/preshed-3.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7c2364da27f2875524ce1ca754dc071515a9ad26eb5def4c7e69129a13c9a59", size = 132972 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/b3/1a73ba16bab53043fd19dd0a7838ae05c705dccb329404dd4ad5925767f1/preshed-3.0.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182138033c0730c683a6d97e567ceb8a3e83f3bff5704f300d582238dbd384b3", size = 128751 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/9a/919d3708f6fa98d9eab1a186e6b30ab25a4595907bbc1fea5c1e8faa9b9d/preshed-3.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:345a10be3b86bcc6c0591d343a6dc2bfd86aa6838c30ced4256dfcfa836c3a64", size = 150050 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/69/d9ab108dc670b5be9e292bbd555f39e6eb0a4baab25cd28f792850d5e65b/preshed-3.0.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51d0192274aa061699b284f9fd08416065348edbafd64840c3889617ee1609de", size = 157159 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/fc/78cdbdb79f5d6d45949e72c32445d6c060977ad50a1dcfc0392622165f7c/preshed-3.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:96b857d7a62cbccc3845ac8c41fd23addf052821be4eb987f2eb0da3d8745aa1", size = 122323 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/7e/a41595876f644d8bd2c3d5422d7211e876b1848a8cc0c03cce33d9cd048a/preshed-3.0.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4fe6720012c62e6d550d6a5c1c7ad88cacef8388d186dad4bafea4140d9d198", size = 133196 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/68/1b4772ff3232e71b63a9206936eb1f75e976ebf4e4e24dc9b3ea7b68369b/preshed-3.0.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e04f05758875be9751e483bd3c519c22b00d3b07f5a64441ec328bb9e3c03700", size = 128594 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/52/48eefe876a3841c5850bd955daf145d0e408567c8f46a997bce136dc259d/preshed-3.0.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a55091d0e395f1fdb62ab43401bb9f8b46c7d7794d5b071813c29dc1ab22fd0", size = 149220 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/ea/9e6c1a7b1d623f6340379290d603a3b8a71ce52a93f842fbf7547f7f1812/preshed-3.0.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de8f5138bcac7870424e09684dc3dd33c8e30e81b269f6c9ede3d8c7bb8e257", size = 156809 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/e4/d074efb7e8a8873d346d2fb8dd43e19b1eae0697351c0d79cff947cba46e/preshed-3.0.9-cp312-cp312-win_amd64.whl", hash = "sha256:24229c77364628743bc29c5620c5d6607ed104f0e02ae31f8a030f99a78a5ceb", size = 122428 }, ] [[package]]