From c70d71914c6b8acac4291cdc7a0530dc90608fa9 Mon Sep 17 00:00:00 2001 From: Mateo Date: Tue, 8 Sep 2026 07:06:49 +0200 Subject: [PATCH 1/7] fix: declare huggingface_hub where it is used, and unpin it where it is not MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pyro_predictor imports huggingface_hub (hf_hub_download, in vision.py) but never declared it. It resolves today only because pyroengine drags it in — an undeclared dependency that breaks the moment pyro_predictor is installed on its own, which is the point of having extracted it. pyroengine pins huggingface_hub==0.23.1 and imports it nowhere: zero occurrences across __init__, core, engine, sensors and utils. The pin is a leftover from before the split, and being exact it propagates to every consumer. It makes pyroengine uninstallable alongside anything needing a modern huggingface_hub — pyro-train requires >=1.8.0, and uv reports the requirements unsatisfiable. Declared as >=0.23.1 rather than pinned: the single call site uses hf_hub_download(repo_id=..., filename=..., local_dir=...), whose signature is unchanged from 0.23 through 1.x — verified against 1.8.0. --- pyproject.toml | 1 - pyro-predictor/pyproject.toml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c9737a69..439a6c61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,6 @@ classifiers = [ ] dependencies = [ "requests>=2.33.0,<3", - "huggingface_hub==0.23.1", "python-dotenv==1.1.0", "pyroclient @ git+https://github.com/pyronear/pyro-api.git@main#subdirectory=client", "pyro_camera_api_client", diff --git a/pyro-predictor/pyproject.toml b/pyro-predictor/pyproject.toml index 13ca17af..8a2c3682 100644 --- a/pyro-predictor/pyproject.toml +++ b/pyro-predictor/pyproject.toml @@ -29,6 +29,7 @@ dependencies = [ "tqdm==4.67.1", "onnxruntime==1.22.1", "ncnn==1.0.20240410", + "huggingface_hub>=0.23.1", ] [project.urls] From 40d475213d187ee64b820789da4257cded8ae1fd Mon Sep 17 00:00:00 2001 From: Mateo Date: Tue, 8 Sep 2026 07:34:26 +0200 Subject: [PATCH 2/7] fix: refresh the lockfile for the huggingface_hub move MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI runs `uv sync --locked`, so changing pyproject.toml without relocking fails the build before it installs anything. The resolution is unchanged — huggingface-hub stays at 0.23.1, since `>=0.23.1` is satisfied by what was already locked. Only the declaration moves, from pyroengine to pyro-predictor. Consumers needing a newer version are now free to resolve one; this repo does not force it on them. --- uv.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uv.lock b/uv.lock index e8ab51f7..1e451214 100644 --- a/uv.lock +++ b/uv.lock @@ -1137,6 +1137,7 @@ name = "pyro-predictor" version = "1.0.0" source = { editable = "pyro-predictor" } dependencies = [ + { name = "huggingface-hub" }, { name = "ncnn" }, { name = "numpy" }, { name = "onnxruntime" }, @@ -1147,6 +1148,7 @@ dependencies = [ [package.metadata] requires-dist = [ + { name = "huggingface-hub", specifier = ">=0.23.1" }, { name = "ncnn", specifier = "==1.0.20240410" }, { name = "numpy", specifier = ">=1.26,<3" }, { name = "onnxruntime", specifier = "==1.22.1" }, @@ -1167,7 +1169,6 @@ dependencies = [ name = "pyroengine" source = { editable = "." } dependencies = [ - { name = "huggingface-hub" }, { name = "pyro-camera-api-client" }, { name = "pyro-predictor" }, { name = "pyroclient" }, @@ -1205,7 +1206,6 @@ quality = [ [package.metadata] requires-dist = [ - { name = "huggingface-hub", specifier = "==0.23.1" }, { name = "pyro-camera-api-client", editable = "pyro_camera_api/client" }, { name = "pyro-predictor", editable = "pyro-predictor" }, { name = "pyroclient", git = "https://github.com/pyronear/pyro-api.git?subdirectory=client&rev=main" }, From e3443a7ced813bb7dc11304136800555a02fcc9c Mon Sep 17 00:00:00 2001 From: Mateo Date: Tue, 8 Sep 2026 07:40:43 +0200 Subject: [PATCH 3/7] chore(deps): upgrade huggingface_hub to 1.30.0 hf_hub 1.x logs its HTTP requests through httpx at INFO level, so the verbose=False test now filters caplog to the pyro_predictor logger it actually targets. --- requirements.txt | 35 ++++++++++++---- tests/test_predictor.py | 2 +- uv.lock | 93 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 112 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index 56ed89f5..9de936a2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,16 @@ # This file was autogenerated by uv via the following command: -# uv export --no-hashes --no-emit-project --no-default-groups --no-dev --no-emit-package pyro_predictor --no-emit-package pyro_camera_api_client --format requirements-txt -o requirements-all.txt +# uv export --no-hashes --no-emit-project --no-default-groups --no-dev --no-emit-package pyro_predictor --no-emit-package pyro_camera_api_client --format requirements-txt -o requirements.txt +anyio==4.14.2 + # via httpx certifi==2026.2.25 - # via requests + # via + # httpcore + # httpx + # requests charset-normalizer==3.4.7 # via requests +click==8.5.0 + # via huggingface-hub colorama==0.4.6 ; sys_platform == 'win32' # via tqdm coloredlogs==15.0.1 @@ -14,12 +21,23 @@ flatbuffers==25.12.19 # via onnxruntime fsspec==2026.3.0 # via huggingface-hub -huggingface-hub==0.23.1 - # via pyroengine +h11==0.16.0 + # via httpcore +hf-xet==1.6.0 ; platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64' + # via huggingface-hub +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via huggingface-hub +huggingface-hub==1.30.0 + # via pyro-predictor humanfriendly==10.0 # via coloredlogs idna==3.11 - # via requests + # via + # anyio + # httpx + # requests mpmath==1.3.0 # via sympy ncnn==1.0.20240410 @@ -33,6 +51,7 @@ numpy==2.4.4 # pyro-predictor onnxruntime==1.22.1 # via pyro-predictor +opencv-python==4.13.0.92 # via ncnn opencv-python-headless==4.11.0.86 # via pyro-predictor @@ -50,6 +69,7 @@ protobuf==7.34.1 # via onnxruntime pyreadline3==3.5.4 ; sys_platform == 'win32' # via humanfriendly +pyroclient @ git+https://github.com/pyronear/pyro-api.git@5c73e72ec86b9a84bc088dded28f19b2cb58282a#subdirectory=client # via pyroengine python-dotenv==1.1.0 # via pyroengine @@ -59,7 +79,6 @@ pyyaml==6.0.3 # via huggingface-hub requests==2.34.2 # via - # huggingface-hub # ncnn # pyro-camera-api-client # pyroclient @@ -72,6 +91,8 @@ tqdm==4.67.1 # ncnn # pyro-predictor typing-extensions==4.15.0 - # via huggingface-hub + # via + # anyio + # huggingface-hub urllib3==2.6.3 # via requests diff --git a/tests/test_predictor.py b/tests/test_predictor.py index a82e2ac9..4b569425 100644 --- a/tests/test_predictor.py +++ b/tests/test_predictor.py @@ -78,4 +78,4 @@ def test_classifier_verbose_false_no_logs(tmpdir_factory, caplog): folder = str(tmpdir_factory.mktemp("cls_cache")) with caplog.at_level(logging.INFO, logger="pyro_predictor"): Classifier(model_folder=folder, format="onnx", verbose=False) - assert caplog.records == [] + assert [r for r in caplog.records if r.name.startswith("pyro_predictor")] == [] diff --git a/uv.lock b/uv.lock index 1e451214..684564fd 100644 --- a/uv.lock +++ b/uv.lock @@ -40,6 +40,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload_time = "2024-01-10T00:56:08.388Z" }, ] +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload_time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload_time = "2026-07-12T20:29:05.763Z" }, +] + [[package]] name = "babel" version = "2.18.0" @@ -190,14 +203,11 @@ wheels = [ [[package]] name = "click" -version = "8.3.2" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload_time = "2026-04-03T19:14:45.118Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload_time = "2026-08-26T13:33:14.56Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload_time = "2026-04-03T19:14:43.505Z" }, + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload_time = "2026-08-26T13:33:12.928Z" }, ] [[package]] @@ -385,22 +395,85 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f4/b2/50e9b292b5cac13e9e81272c7171301abc753a60460d21505b606e15cf21/furo-2025.12.19-py3-none-any.whl", hash = "sha256:bb0ead5309f9500130665a26bee87693c41ce4dbdff864dbfb6b0dae4673d24f", size = 339262, upload_time = "2025-12-19T17:34:38.905Z" }, ] +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload_time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload_time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/ab/522a2ab67f27971a9d48ca666d4fca85ef7d5282d142e31fd087e27b1bbe/hf_xet-1.6.0.tar.gz", hash = "sha256:2e58454a340b3556dfa4972d5451aff4fba8dd42a236600ba1a1d2b1514f0fef", size = 920527, upload_time = "2026-08-03T22:33:13.243Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/62/3c062f593bd92ef4e77a0ef39541e3d82a0a1d3947c8a777a02a13a27828/hf_xet-1.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:70cbb9c896901600128cb9b6f06e132954fbede1db30f31f7c6c63f84cb7c31d", size = 4074584, upload_time = "2026-08-03T22:32:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1e/c0ad437dd267a8e435bef594acf781bbc3874ff0b6435b4962d03ecf7cc4/hf_xet-1.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:23379c2f9ec8696d952b16414a2bae72cad86a52df869b050698ba60f538c675", size = 3867381, upload_time = "2026-08-03T22:32:49.049Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ee/7c0d7b6ab336167531b1c30af2af003f054af4c749becbd7209ae33a77c3/hf_xet-1.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f2f7278c05c22fd60cb436cda1269649b3e81db65ecdc8496e5e164aa4143e7b", size = 4453982, upload_time = "2026-08-03T22:32:50.568Z" }, + { url = "https://files.pythonhosted.org/packages/63/06/ad8eab1c9525246650cbaa821caa3cdbaca734ab1a5b8c91bea09cbd8d69/hf_xet-1.6.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:948f15d3a9545cfe5932f6bd8b440f6ae630aee108f14b7bd6c561f7c2dcc522", size = 4249445, upload_time = "2026-08-03T22:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/d8/26/1eee8aedb0dafc1ab9717dc9ac602cde33361b232dc06803f1f6ed18b58c/hf_xet-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5153e6bb103ad49d6ea9f1b2e230db5a2ea32551ad09a706d2f61d7c7c80d80e", size = 4451099, upload_time = "2026-08-03T22:32:54.114Z" }, + { url = "https://files.pythonhosted.org/packages/67/57/0b88af1f194ab6c9c650547d9cc06bfeaab836ae4dcdb331676bfb8be95a/hf_xet-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:35cec30d75c6f9eb9c16a77cef68e85a103b72e24d4b473714ec9ff06428bab9", size = 4664712, upload_time = "2026-08-03T22:32:55.547Z" }, + { url = "https://files.pythonhosted.org/packages/53/a0/26b717a9d1840e8abf48dcec64b5ed8fbe472671d38ad28d30e147132b33/hf_xet-1.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5789835d7c6bc9436962853192082374297fb72d7eff7e7762ec25ceb7e25338", size = 4025906, upload_time = "2026-08-03T22:32:57.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/f6/4a9966633c6fef83af997e2cff68ec1963676d412bdfd096df2a93b8e185/hf_xet-1.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:75765820ce4700db3750c94acc8fe27c5fae4c9ec000a0dbac3ca082acf97765", size = 3849221, upload_time = "2026-08-03T22:32:59.123Z" }, + { url = "https://files.pythonhosted.org/packages/a2/50/7afa2c9c787405864fc47a0d1bbc02c62e9101947ed43c1f43899fc7d91d/hf_xet-1.6.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:633dc0cd71d32da58ab8c03ad38e2fac452c15c2b0a2866ebf6ededfe0a5061d", size = 4071729, upload_time = "2026-08-03T22:33:00.721Z" }, + { url = "https://files.pythonhosted.org/packages/4b/69/55b8dcf636142ae660fec1869fcac14c4da2e8412e14d6eee1523be77e9f/hf_xet-1.6.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:f0906082d9932ae0c0057fa194041c22b4e2cdb46b2592ef3b91f020d62a081a", size = 3876287, upload_time = "2026-08-03T22:33:02.251Z" }, + { url = "https://files.pythonhosted.org/packages/67/4e/a28359bf1c1ecf11eba22123168c138698f7cb576ac678f5a2e16cd5da08/hf_xet-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d62671bb130879cef0ee4c9ebe47a14af6c66ec53e6d84dc15936e5ffdfac82f", size = 4464663, upload_time = "2026-08-03T22:33:03.802Z" }, + { url = "https://files.pythonhosted.org/packages/9a/69/1f0cbc2fb22ae6082d094f743d1b8945a3f36f6089cb95f42b7ee348cda7/hf_xet-1.6.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0e6e21fa3cdfcdcd76748564bf593870a5e013f47d97cf10aed63aa222cff5b7", size = 4262538, upload_time = "2026-08-03T22:33:05.287Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/4f4f2301ade26e404462d3336fa11f7958d914cabbabdd6e03c3c5d5658c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4fc74352a17015bd0ee90038bc9efe38db894cde45f268b6712b04fce8cd0acb", size = 4460520, upload_time = "2026-08-03T22:33:06.81Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/311725e2a905534dfee2dcb5b08414f249147f1f12252bfc2bd24caa075c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4f71cba6129110c3374a33f919001ff130488fc23553698e34cc1c2a1198c", size = 4675937, upload_time = "2026-08-03T22:33:08.616Z" }, + { url = "https://files.pythonhosted.org/packages/98/b7/8c59a66d15205024662f1d66968136f13893f96df1ddc5087e2e281fc95f/hf_xet-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:fb4fadde1b2b70bf4c0c14a6dccbe7194b1c28947fefd5bbe3fed9d940676c3b", size = 4033128, upload_time = "2026-08-03T22:33:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/73/63/ca511b6f802f28cf3489b280fe77475bcca8de85e81a6299d7916b5b5555/hf_xet-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:3dc3e35441ba395006af5aaacc40ef2e603c51ef46c3530b9156185f00935ea3", size = 3859359, upload_time = "2026-08-03T22:33:11.725Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload_time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload_time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload_time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload_time = "2024-12-06T15:37:21.509Z" }, +] + [[package]] name = "huggingface-hub" -version = "0.23.1" +version = "1.30.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "click" }, { name = "filelock" }, { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, { name = "packaging" }, { name = "pyyaml" }, - { name = "requests" }, { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/58/af8998eb853f8e2caa7bb931612bb0750a69877f17fa03ec8e6badfaf277/huggingface_hub-0.23.1.tar.gz", hash = "sha256:4f62dbf6ae94f400c6d3419485e52bce510591432a5248a65d0cb72e4d479eb4", size = 333599, upload_time = "2024-05-21T16:18:29.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/97/2eb4abaa5b969ed385066a0496a3823b3ff467fc1082e2202955f1867d60/huggingface_hub-1.30.0.tar.gz", hash = "sha256:e6a6120bc8c8e2723d03648434ee247088cceb55ba7067e7d34d692cad5fdb57", size = 964291, upload_time = "2026-09-03T10:05:14.053Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/27/1a30d8082ef3c8615ae198b9d451fafffdab815b96727ec3c06befc27ebe/huggingface_hub-0.23.1-py3-none-any.whl", hash = "sha256:720a5bffd2b1b449deb793da8b0df7a9390a7e238534d5a08c9fbcdecb1dd3cb", size = 401259, upload_time = "2024-05-21T16:18:27.739Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0e/3e45bbe0dd48f4e56b1d46649d342de853cd1c7e815323472ab62687f153/huggingface_hub-1.30.0-py3-none-any.whl", hash = "sha256:96ae0a8e99a234374a6fe43e989ebd21c04640b91ab2927e7e5773ba1131ca59", size = 796795, upload_time = "2026-09-03T10:05:12.21Z" }, ] [[package]] From 2fd7768002c4009957145de5b8e89156cde37470 Mon Sep 17 00:00:00 2001 From: Mateo Date: Tue, 8 Sep 2026 07:43:13 +0200 Subject: [PATCH 4/7] fix: keep pyroclient git dep out of requirements.txt The runtime image stage has no git; pyroclient installs from requirements-git.txt in the git-deps stage. --- requirements.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9de936a2..813e9f80 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv export --no-hashes --no-emit-project --no-default-groups --no-dev --no-emit-package pyro_predictor --no-emit-package pyro_camera_api_client --format requirements-txt -o requirements.txt +# uv export --no-hashes --no-emit-project --no-default-groups --no-dev --no-emit-package pyro_predictor --no-emit-package pyro_camera_api_client --no-emit-package pyroclient --format requirements-txt -o requirements.txt anyio==4.14.2 # via httpx certifi==2026.2.25 @@ -69,8 +69,6 @@ protobuf==7.34.1 # via onnxruntime pyreadline3==3.5.4 ; sys_platform == 'win32' # via humanfriendly -pyroclient @ git+https://github.com/pyronear/pyro-api.git@5c73e72ec86b9a84bc088dded28f19b2cb58282a#subdirectory=client - # via pyroengine python-dotenv==1.1.0 # via pyroengine pywin32==311 ; sys_platform == 'win32' From 3e775c853ea06b8b53c0bdcaca4033489a066fa4 Mon Sep 17 00:00:00 2001 From: Mateo Date: Tue, 8 Sep 2026 10:53:04 +0200 Subject: [PATCH 5/7] chore(deps): raise huggingface_hub floor to 1.30.0 --- pyro-predictor/pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyro-predictor/pyproject.toml b/pyro-predictor/pyproject.toml index 8a2c3682..9937df8a 100644 --- a/pyro-predictor/pyproject.toml +++ b/pyro-predictor/pyproject.toml @@ -29,7 +29,7 @@ dependencies = [ "tqdm==4.67.1", "onnxruntime==1.22.1", "ncnn==1.0.20240410", - "huggingface_hub>=0.23.1", + "huggingface_hub>=1.30.0", ] [project.urls] diff --git a/uv.lock b/uv.lock index 684564fd..6e23b878 100644 --- a/uv.lock +++ b/uv.lock @@ -1221,7 +1221,7 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "huggingface-hub", specifier = ">=0.23.1" }, + { name = "huggingface-hub", specifier = ">=1.30.0" }, { name = "ncnn", specifier = "==1.0.20240410" }, { name = "numpy", specifier = ">=1.26,<3" }, { name = "onnxruntime", specifier = "==1.22.1" }, From 78f2e6c4ba0ca0541785046a57e3cd37c3fe0457 Mon Sep 17 00:00:00 2001 From: Mateo Date: Tue, 8 Sep 2026 16:09:11 +0200 Subject: [PATCH 6/7] fix: regenerate requirements.txt with make lock Drops the hand-edited export: opencv-python (stripped on purpose since #338) is filtered out again and the redundant --no-emit-package pyroclient flag is gone from the header, as requested in review. --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 813e9f80..e3f7594c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv export --no-hashes --no-emit-project --no-default-groups --no-dev --no-emit-package pyro_predictor --no-emit-package pyro_camera_api_client --no-emit-package pyroclient --format requirements-txt -o requirements.txt +# uv export --no-hashes --no-emit-project --no-default-groups --no-dev --no-emit-package pyro_predictor --no-emit-package pyro_camera_api_client --format requirements-txt -o requirements-all.txt anyio==4.14.2 # via httpx certifi==2026.2.25 @@ -51,7 +51,6 @@ numpy==2.4.4 # pyro-predictor onnxruntime==1.22.1 # via pyro-predictor -opencv-python==4.13.0.92 # via ncnn opencv-python-headless==4.11.0.86 # via pyro-predictor @@ -69,6 +68,7 @@ protobuf==7.34.1 # via onnxruntime pyreadline3==3.5.4 ; sys_platform == 'win32' # via humanfriendly + # via pyroengine python-dotenv==1.1.0 # via pyroengine pywin32==311 ; sys_platform == 'win32' From 5ae7a575529d71e88181a0b7ee8489749552d768 Mon Sep 17 00:00:00 2001 From: Mateo Date: Tue, 8 Sep 2026 16:09:11 +0200 Subject: [PATCH 7/7] fix(predictor): verbose=False also silences hf_hub's httpx request logs --- pyro-predictor/pyro_predictor/vision.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyro-predictor/pyro_predictor/vision.py b/pyro-predictor/pyro_predictor/vision.py index 0ff66cc5..17ade8cb 100644 --- a/pyro-predictor/pyro_predictor/vision.py +++ b/pyro-predictor/pyro_predictor/vision.py @@ -54,6 +54,8 @@ def __init__( self.verbose = verbose if not verbose: logger.setLevel(logging.WARNING) + # hf_hub 1.x logs its HTTP requests through httpx at INFO + logging.getLogger("httpx").setLevel(logging.WARNING) if model_path: if not pathlib.Path(model_path).is_file():