From b549a15e2124ec62145cd7f0a1e5f0ec15eac958 Mon Sep 17 00:00:00 2001 From: Jonathon Belotti Date: Sat, 7 Nov 2026 12:56:47 -0500 Subject: [PATCH 1/2] build(deps): upgrade Modal client to 1.6.3 --- pyproject.toml | 2 +- uv.lock | 558 +++++++++++++++++++++++++------------------------ 2 files changed, 287 insertions(+), 273 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index cef5aa14e..e7122ec5e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,7 @@ dependencies = [ "pyyaml>=6.0", "starlette>=0.40", # the local grant server "uvicorn>=0.47", # 0.47 adds ssl_context_factory, how the local grant server gets its TLS context - "modal>=1.5.2.dev22", # dev22 adds _experimental_create(tags=); dev2 added VM-mode V2 (vm_runtime) + "modal>=1.6.3", "e2b~=2.46.4", # AsyncSandbox/AsyncTemplate APIs validated against the 2.46 line "fastapi>=0.110", # the explorer, agent-env up "tzdata>=2024.1", # sync_env_clock reads a task's timezone on a worker image with no system zone files diff --git a/uv.lock b/uv.lock index 2de1e89a8..90926daf7 100644 --- a/uv.lock +++ b/uv.lock @@ -1,17 +1,19 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.11.4" resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] @@ -235,7 +237,7 @@ requires-dist = [ { name = "jsonschema", specifier = ">=4.20" }, { name = "litellm", specifier = ">=1.96.0,<1.97" }, { name = "mcp", specifier = ">=1.25,<2" }, - { name = "modal", specifier = ">=1.5.2.dev22" }, + { name = "modal", specifier = ">=1.6.3" }, { name = "moto", marker = "extra == 'dev'", specifier = ">=5.0.0" }, { name = "nemo-gym", marker = "python_full_version >= '3.13.14' and extra == 'nemo-gym'", specifier = ">=0.7.0rc0" }, { name = "omegaconf", marker = "python_full_version >= '3.13.14' and extra == 'nemo-gym'", specifier = ">=2.3" }, @@ -558,7 +560,7 @@ name = "aiohttp-cors" version = "0.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp", marker = "python_full_version >= '3.13.14'" }, + { name = "aiohttp" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/d89e846a5444b3d5eb8985a6ddb0daef3774928e1bfbce8e84ec97b0ffa7/aiohttp_cors-0.8.1.tar.gz", hash = "sha256:ccacf9cb84b64939ea15f859a146af1f662a6b1d68175754a07315e305fb1403", size = 38626, upload-time = "2025-03-31T14:16:20.048Z" } wheels = [ @@ -595,9 +597,9 @@ name = "alembic" version = "1.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mako", marker = "python_full_version >= '3.13.14'" }, - { name = "sqlalchemy", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/93/1c/00909e0fbebad2121d916fdcab044cae988146680e9ee4387ba25fef8747/alembic-1.20.1.tar.gz", hash = "sha256:83490def1f723413db5096591f7609ac52544805be93849170088ed04f5a2e0b", size = 2103576, upload-time = "2026-10-22T03:24:35.93Z" } wheels = [ @@ -627,14 +629,14 @@ name = "anthropic" version = "0.109.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "distro", marker = "python_full_version >= '3.13.14'" }, - { name = "docstring-parser", marker = "python_full_version >= '3.13.14'" }, - { name = "httpx", marker = "python_full_version >= '3.13.14'" }, - { name = "jiter", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, - { name = "sniffio", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, + { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "distro" }, + { name = "docstring-parser" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1b/b7/9a8e2f79011e89dd6eeb599c27332aed765dac9d6fbee3a55e68e4e3ec25/anthropic-0.109.2.tar.gz", hash = "sha256:d37db299597c7bc124b49b767ff135f1e6456b64af2b2fad4b63b2a1df333cf0", size = 927559, upload-time = "2026-06-15T17:30:25.024Z" } wheels = [ @@ -655,14 +657,14 @@ resolution-markers = [ "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] dependencies = [ - { name = "idna", marker = "python_full_version < '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or python_full_version >= '3.13.14'" }, ] 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 = [ @@ -674,14 +676,16 @@ name = "anyio" version = "4.15.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform == 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform != 'win32'", ] dependencies = [ - { name = "idna", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14' and python_full_version < '3.15'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.15'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" } wheels = [ @@ -693,7 +697,7 @@ name = "asttokens" version = "2.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six", marker = "python_full_version >= '3.13.14'" }, + { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284, upload-time = "2023-10-26T10:03:05.06Z" } wheels = [ @@ -813,11 +817,13 @@ name = "av" version = "19.0.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'emscripten'", @@ -1336,7 +1342,7 @@ name = "colorful" version = "0.5.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.13.14' and sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/82/31/109ef4bedeb32b4202e02ddb133162457adc4eb890a9ed9c05c9dd126ed0/colorful-0.5.8.tar.gz", hash = "sha256:bb16502b198be2f1c42ba3c52c703d5f651d826076817185f0294c1a549a7445", size = 209361, upload-time = "2025-10-29T11:53:21.663Z" } wheels = [ @@ -1361,7 +1367,7 @@ name = "contourpy" version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, + { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/5a/a55177dd22553a277388e8a1b3220e92de91bacb28356cdc73caa240121d/contourpy-1.4.0.tar.gz", hash = "sha256:20156f5a1ac4f8ce02656e39a61e82164a3d359796dc8026f75b062783d500e1", size = 13323726, upload-time = "2026-09-11T19:05:05.808Z" } wheels = [ @@ -1497,12 +1503,12 @@ name = "cwevals" version = "0.0.1b1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "distro", marker = "python_full_version >= '3.13.14'" }, - { name = "httpx", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, - { name = "sniffio", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, + { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "distro" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/91/82/d176b1832e6632c5ebdabbbb943655902f3ff867a18262a0b6cb0e9bf560/cwevals-0.0.1b1.tar.gz", hash = "sha256:2ae997369ff44941925e4db1bd07eb4e13c05de412e615636fd12881d63f8a13", size = 258563, upload-time = "2026-09-28T18:21:23.442Z" } wheels = [ @@ -1553,10 +1559,10 @@ name = "databricks-sdk" version = "0.156.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "google-auth", marker = "python_full_version >= '3.13.14'" }, - { name = "protobuf", marker = "python_full_version >= '3.13.14'" }, - { name = "requests", marker = "python_full_version >= '3.13.14'" }, - { name = "urllib3", marker = "python_full_version >= '3.13.14'" }, + { name = "google-auth" }, + { name = "protobuf" }, + { name = "requests" }, + { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c7/ae/d2ecf557009dfcb6788fcdcb911426f61541c9d80d32220aaf642f18328d/databricks_sdk-0.156.0.tar.gz", hash = "sha256:d6b04f07b052654d4897f69f6ad6c7c7b4df224a72a6deeee2517fbb429a33a9", size = 1169958, upload-time = "2026-10-22T04:33:34.699Z" } wheels = [ @@ -1734,9 +1740,9 @@ name = "devtools" version = "0.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "asttokens", marker = "python_full_version >= '3.13.14'" }, - { name = "executing", marker = "python_full_version >= '3.13.14'" }, - { name = "pygments", marker = "python_full_version >= '3.13.14'" }, + { name = "asttokens" }, + { name = "executing" }, + { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4c/ac/480ca726f38d1b6a8fb2af6b0b861e130dfd3e03c9bcc5a151ddedb289aa/devtools-0.13.0.tar.gz", hash = "sha256:e3a848080404bd4e10dbf535fe016c6b593fccf24a8edac863048b8cbab3d92f", size = 14625, upload-time = "2026-10-11T17:57:13.828Z" } wheels = [ @@ -1784,9 +1790,9 @@ name = "docker" version = "7.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywin32", marker = "python_full_version >= '3.13.14' and sys_platform == 'win32'" }, - { name = "requests", marker = "python_full_version >= '3.13.14'" }, - { name = "urllib3", marker = "python_full_version >= '3.13.14'" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/88/7f/731ff914b0255d3d065f45fd4e626d4b8c95dbcbaada049f337a6ac16410/docker-7.2.0.tar.gz", hash = "sha256:cebb93773d334f778e023a7ee352a8d6e13ab1bd3b863a4d4a59dec897df43ac", size = 118731, upload-time = "2026-07-09T14:53:46.39Z" } wheels = [ @@ -2024,12 +2030,12 @@ name = "flask" version = "3.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "blinker", marker = "python_full_version >= '3.13.14'" }, - { name = "click", marker = "python_full_version >= '3.13.14'" }, - { name = "itsdangerous", marker = "python_full_version >= '3.13.14'" }, - { name = "jinja2", marker = "python_full_version >= '3.13.14'" }, - { name = "markupsafe", marker = "python_full_version >= '3.13.14'" }, - { name = "werkzeug", marker = "python_full_version >= '3.13.14'" }, + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "werkzeug" }, ] sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } wheels = [ @@ -2041,8 +2047,8 @@ name = "flask-cors" version = "6.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "flask", marker = "python_full_version >= '3.13.14'" }, - { name = "werkzeug", marker = "python_full_version >= '3.13.14'" }, + { name = "flask" }, + { name = "werkzeug" }, ] sdist = { url = "https://files.pythonhosted.org/packages/47/03/4e464a50860f9adf08b5c1d3479cb8ea1f12af2aa69535c7042c6e628135/flask_cors-6.0.5.tar.gz", hash = "sha256:30c5031552cd59f620ac0c8211dac45b345d3b2df310e7721879e4f46ef9c601", size = 101386, upload-time = "2026-06-08T20:20:17.765Z" } wheels = [ @@ -2245,7 +2251,7 @@ name = "gitdb" version = "4.0.12" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "smmap", marker = "python_full_version >= '3.13.14'" }, + { name = "smmap" }, ] sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } wheels = [ @@ -2257,7 +2263,7 @@ name = "gitpython" version = "3.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "gitdb", marker = "python_full_version >= '3.13.14'" }, + { name = "gitdb" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/ff/fee293f1ec3e1b64db6eb270e00964f29c086d769201474cedb8d1608930/gitpython-3.2.1.tar.gz", hash = "sha256:0f1229ec5c057bdabdeeda8bda4f17bda679ab33dbccc00f24e6a480553c8613", size = 241688, upload-time = "2026-10-14T12:20:20.589Z" } wheels = [ @@ -2472,10 +2478,10 @@ name = "graphene" version = "3.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "graphql-core", marker = "python_full_version >= '3.13.14'" }, - { name = "graphql-relay", marker = "python_full_version >= '3.13.14'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, + { name = "graphql-core" }, + { name = "graphql-relay" }, + { name = "python-dateutil" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cc/f6/bf62ff950c317ed03e77f3f6ddd7e34aaa98fe89d79ebd660c55343d8054/graphene-3.4.3.tar.gz", hash = "sha256:2a3786948ce75fe7e078443d37f609cbe5bb36ad8d6b828740ad3b95ed1a0aaa", size = 44739, upload-time = "2024-11-09T20:44:25.757Z" } wheels = [ @@ -2496,7 +2502,7 @@ name = "graphql-relay" version = "3.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "graphql-core", marker = "python_full_version >= '3.13.14'" }, + { name = "graphql-core" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d1/13/98fbf8d67552f102488ffc16c6f559ce71ea15f6294728d33928ab5ff14d/graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c", size = 50027, upload-time = "2022-04-16T11:03:45.447Z" } wheels = [ @@ -2718,8 +2724,8 @@ name = "httpcore2" version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "h11", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, - { name = "truststore", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, + { name = "h11" }, + { name = "truststore" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/f3/1db7aa2bc2524062192bb0e0323969492d1883152a232fe36eea65f4e35c/httpcore2-2.13.1.tar.gz", hash = "sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103", size = 68071, upload-time = "2026-09-23T07:47:22.372Z" } wheels = [ @@ -2933,9 +2939,9 @@ name = "hydra-core" version = "1.3.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "antlr4-python3-runtime", marker = "python_full_version >= '3.13.14'" }, - { name = "omegaconf", marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, + { name = "antlr4-python3-runtime" }, + { name = "omegaconf" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/7c/1d/e1ad315ca93f1b090b0782942535fea8344e8b2d749c92117b2bf45f4407/hydra_core-1.3.8.tar.gz", hash = "sha256:18d5dfb841734a936507e75e7b8390b406ed22494f7fb8b4b7b7c122102de3d5", size = 3278858, upload-time = "2026-10-25T13:42:22.491Z" } wheels = [ @@ -3240,7 +3246,7 @@ name = "joblib" version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cloudpickle", marker = "python_full_version >= '3.13.14'" }, + { name = "cloudpickle" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d5/1d/537ab090f302b838943a1b56497dd53059b9a9b46a074936470173a2e207/joblib-1.6.0.tar.gz", hash = "sha256:2ccc96785b12046c08fd6d55839c12857831b54a3c1673ffadd2f04bfc4eda03", size = 327903, upload-time = "2026-08-31T09:39:04.122Z" } wheels = [ @@ -3515,7 +3521,7 @@ name = "mako" version = "1.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markupsafe", marker = "python_full_version >= '3.13.14'" }, + { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5a/09/e07c4b5579a79f4b16f8d4f29f6c54514ac787c4ad506b8c4f28a0e6b0bf/mako-1.4.3.tar.gz", hash = "sha256:cd6537fe88d5fec315c55c2f8529bc4ce7a9a352ad7db3eeaa6a66e2dd4ec37a", size = 412799, upload-time = "2026-09-22T20:54:31.509Z" } wheels = [ @@ -3613,15 +3619,15 @@ name = "matplotlib" version = "3.11.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "contourpy", marker = "python_full_version >= '3.13.14'" }, - { name = "cycler", marker = "python_full_version >= '3.13.14'" }, - { name = "fonttools", marker = "python_full_version >= '3.13.14'" }, - { name = "kiwisolver", marker = "python_full_version >= '3.13.14'" }, - { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "pillow", marker = "python_full_version >= '3.13.14'" }, - { name = "pyparsing", marker = "python_full_version >= '3.13.14'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.13.14'" }, + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e7/c8/9aa712a0afb882649424dd8de8ad9aa6235e796e84c6052e8f6dc1598d0d/matplotlib-3.11.2.tar.gz", hash = "sha256:cec596316640f2b394b8f0daa0ea61a8eae82d017b620b9f202befb972a59ea4", size = 32660610, upload-time = "2026-09-11T19:05:31.214Z" } wheels = [ @@ -3719,26 +3725,26 @@ name = "mlflow" version = "3.17.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp", marker = "python_full_version >= '3.13.14'" }, - { name = "alembic", marker = "python_full_version >= '3.13.14'" }, - { name = "cryptography", marker = "python_full_version >= '3.13.14'" }, - { name = "docker", marker = "python_full_version >= '3.13.14'" }, - { name = "flask", marker = "python_full_version >= '3.13.14'" }, - { name = "flask-cors", marker = "python_full_version >= '3.13.14'" }, - { name = "graphene", marker = "python_full_version >= '3.13.14'" }, - { name = "gunicorn", marker = "python_full_version >= '3.13.14' and sys_platform != 'win32'" }, - { name = "huey", marker = "python_full_version >= '3.13.14'" }, - { name = "matplotlib", marker = "python_full_version >= '3.13.14'" }, - { name = "mlflow-skinny", marker = "python_full_version >= '3.13.14'" }, - { name = "mlflow-tracing", marker = "python_full_version >= '3.13.14'" }, - { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "pandas", marker = "python_full_version >= '3.13.14'" }, - { name = "pyarrow", version = "25.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "scikit-learn", marker = "python_full_version >= '3.13.14'" }, - { name = "scipy", marker = "python_full_version >= '3.13.14'" }, - { name = "skops", marker = "python_full_version >= '3.13.14'" }, - { name = "sqlalchemy", marker = "python_full_version >= '3.13.14'" }, - { name = "waitress", marker = "python_full_version >= '3.13.14' and sys_platform == 'win32'" }, + { name = "aiohttp" }, + { name = "alembic" }, + { name = "cryptography" }, + { name = "docker" }, + { name = "flask" }, + { name = "flask-cors" }, + { name = "graphene" }, + { name = "gunicorn", marker = "sys_platform != 'win32'" }, + { name = "huey" }, + { name = "matplotlib" }, + { name = "mlflow-skinny" }, + { name = "mlflow-tracing" }, + { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" } }, + { name = "pandas" }, + { name = "pyarrow", version = "25.0.1", source = { registry = "https://pypi.org/simple" } }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "skops" }, + { name = "sqlalchemy" }, + { name = "waitress", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/67/fb/1b576cbec9a23017529aac0e6c86653da7479c72fa7c070238bbcd8b50fe/mlflow-3.17.2.tar.gz", hash = "sha256:3fcdb58c683362763bf1cb124eea800b4e3253e16cb5e3adf5b5e562af1fdf2b", size = 11165270, upload-time = "2026-10-21T02:08:45.983Z" } wheels = [ @@ -3750,27 +3756,27 @@ name = "mlflow-skinny" version = "3.17.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "cachetools", marker = "python_full_version >= '3.13.14'" }, - { name = "click", marker = "python_full_version >= '3.13.14'" }, - { name = "cloudpickle", marker = "python_full_version >= '3.13.14'" }, - { name = "databricks-sdk", marker = "python_full_version >= '3.13.14'" }, - { name = "fastapi", marker = "python_full_version >= '3.13.14'" }, - { name = "gitpython", marker = "python_full_version >= '3.13.14'" }, - { name = "importlib-metadata", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-api", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-proto", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-sdk", marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "protobuf", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, - { name = "python-dotenv", marker = "python_full_version >= '3.13.14'" }, - { name = "pyyaml", marker = "python_full_version >= '3.13.14'" }, - { name = "requests", marker = "python_full_version >= '3.13.14'" }, - { name = "sqlparse", marker = "python_full_version >= '3.13.14'" }, - { name = "starlette", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, - { name = "uvicorn", marker = "python_full_version >= '3.13.14'" }, + { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "cachetools" }, + { name = "click" }, + { name = "cloudpickle" }, + { name = "databricks-sdk" }, + { name = "fastapi" }, + { name = "gitpython" }, + { name = "importlib-metadata" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "protobuf" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlparse" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "uvicorn" }, ] sdist = { url = "https://files.pythonhosted.org/packages/26/b0/efbc07a721df135c681dd9f29ecb44b42e9664125f82a41168bc38240ed8/mlflow_skinny-3.17.2.tar.gz", hash = "sha256:5f2a0812d019a8f517a58f1377922f75af4f42832be30c8f1441005b51288596", size = 3488534, upload-time = "2026-10-21T02:07:10.993Z" } wheels = [ @@ -3782,14 +3788,14 @@ name = "mlflow-tracing" version = "3.17.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cachetools", marker = "python_full_version >= '3.13.14'" }, - { name = "databricks-sdk", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-api", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-proto", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-sdk", marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "protobuf", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, + { name = "cachetools" }, + { name = "databricks-sdk" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "protobuf" }, + { name = "pydantic" }, ] sdist = { url = "https://files.pythonhosted.org/packages/af/81/bf76610e755643d454fe1eb52fd6aae99d2e7d472a4a4cd119fa11a7a653/mlflow_tracing-3.17.2.tar.gz", hash = "sha256:35da9f6cc450feae7173941d0d119391f6fe3a41973c0a28ae4a021e6e285c99", size = 1688723, upload-time = "2026-10-21T02:07:48.333Z" } wheels = [ @@ -3798,7 +3804,7 @@ wheels = [ [[package]] name = "modal" -version = "1.6.2.dev1" +version = "1.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -3815,9 +3821,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "watchfiles" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/32/9c3b4fd71861b4b07a0d9b56227145e06f501b315fa89ea32c25a105f417/modal-1.6.2.dev1.tar.gz", hash = "sha256:444587f3f34ef36babefb05d28172c2ff1ccaaa0407dbd56cdf195a3a509b102", size = 942938, upload-time = "2026-10-05T01:05:39.241Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/d5/17154c55985e3f7971bc8babc5afcbad2cb2e70f656f49090ef414f4f98d/modal-1.6.3.tar.gz", hash = "sha256:f6c1c59172274357e260a6f3d24254dddb472a6d4202cabce87452c127a1779c", size = 998061, upload-time = "2026-10-27T19:25:48.27Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/1a/0aa857ba2c3eab44cc5e4c49e1f5bfe3f994190e517582f715c1fef951c6/modal-1.6.2.dev1-py3-none-any.whl", hash = "sha256:e905dd61af553207b626c613f28642561f44407d31e0c2722b0dd4249850dc7e", size = 1063534, upload-time = "2026-10-05T01:05:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/5d/1a/cb66a3d467dfa70cabc0310cb8e3af9d03b50b51eba84232b9e855cff95c/modal-1.6.3-py3-none-any.whl", hash = "sha256:31e8952c8908740f3fbc666191fec78ff5fadecb7a48a29d40aed90b39531ffe", size = 1127862, upload-time = "2026-10-27T19:25:44.76Z" }, ] [[package]] @@ -4095,43 +4101,43 @@ name = "nemo-gym" version = "0.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp", marker = "python_full_version >= '3.13.14'" }, - { name = "anthropic", marker = "python_full_version >= '3.13.14'" }, - { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "datasets", marker = "python_full_version >= '3.13.14'" }, - { name = "devtools", marker = "python_full_version >= '3.13.14'" }, - { name = "fastapi", marker = "python_full_version >= '3.13.14'" }, - { name = "fonttools", marker = "python_full_version >= '3.13.14'" }, - { name = "gitpython", marker = "python_full_version >= '3.13.14'" }, - { name = "httptools", marker = "python_full_version >= '3.13.14'" }, - { name = "hydra-core", marker = "python_full_version >= '3.13.14'" }, - { name = "itsdangerous", marker = "python_full_version >= '3.13.14'" }, - { name = "jinja2", marker = "python_full_version >= '3.13.14'" }, - { name = "mcp", marker = "python_full_version >= '3.13.14'" }, - { name = "mlflow", marker = "python_full_version >= '3.13.14'" }, - { name = "mlflow-skinny", marker = "python_full_version >= '3.13.14'" }, - { name = "omegaconf", marker = "python_full_version >= '3.13.14'" }, - { name = "openai", version = "2.44.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "orjson", marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "psutil", marker = "python_full_version >= '3.13.14'" }, - { name = "pyarrow", version = "25.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "pyasn1", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic-core", marker = "python_full_version >= '3.13.14'" }, - { name = "pydot", marker = "python_full_version >= '3.13.14'" }, - { name = "pyjwt", marker = "python_full_version >= '3.13.14'" }, - { name = "python-multipart", marker = "python_full_version >= '3.13.14'" }, - { name = "ray", extra = ["default"], marker = "python_full_version >= '3.13.14'" }, - { name = "rich", marker = "python_full_version >= '3.13.14'" }, - { name = "scipy", marker = "python_full_version >= '3.13.14'" }, - { name = "sqlparse", marker = "python_full_version >= '3.13.14'" }, - { name = "tqdm", marker = "python_full_version >= '3.13.14'" }, - { name = "urllib3", marker = "python_full_version >= '3.13.14'" }, - { name = "uvicorn", marker = "python_full_version >= '3.13.14'" }, - { name = "uvloop", marker = "python_full_version >= '3.13.14'" }, - { name = "wandb", marker = "python_full_version >= '3.13.14'" }, - { name = "yappi", marker = "python_full_version >= '3.13.14'" }, + { name = "aiohttp" }, + { name = "anthropic" }, + { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "datasets" }, + { name = "devtools" }, + { name = "fastapi" }, + { name = "fonttools" }, + { name = "gitpython" }, + { name = "httptools" }, + { name = "hydra-core" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "mcp" }, + { name = "mlflow" }, + { name = "mlflow-skinny" }, + { name = "omegaconf" }, + { name = "openai", version = "2.44.0", source = { registry = "https://pypi.org/simple" } }, + { name = "orjson" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "psutil" }, + { name = "pyarrow", version = "25.0.1", source = { registry = "https://pypi.org/simple" } }, + { name = "pyasn1" }, + { name = "pydantic" }, + { name = "pydantic-core" }, + { name = "pydot" }, + { name = "pyjwt" }, + { name = "python-multipart" }, + { name = "ray", extra = ["default"] }, + { name = "rich" }, + { name = "scipy" }, + { name = "sqlparse" }, + { name = "tqdm" }, + { name = "urllib3" }, + { name = "uvicorn" }, + { name = "uvloop" }, + { name = "wandb" }, + { name = "yappi" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/d9/1031af1c430eeff8ccfd33b66a101692c7cbc812e4d9e9d1225ffde97872/nemo_gym-0.7.0.tar.gz", hash = "sha256:5e926964daf827520e68d8281be886c231bd26d86c2a0432fdda1ab41893862e", size = 44131772, upload-time = "2026-10-12T16:06:06.39Z" } wheels = [ @@ -4226,11 +4232,13 @@ name = "numpy" version = "2.5.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'emscripten'", @@ -4359,8 +4367,8 @@ name = "omegaconf" version = "2.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "antlr4-python3-runtime", marker = "python_full_version >= '3.13.14'" }, - { name = "pyyaml", marker = "python_full_version >= '3.13.14'" }, + { name = "antlr4-python3-runtime" }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/3d/e4b57b8d9008c6ebe0d5eff901f91d5700cf7bdb8c8863df817463a7fd5e/omegaconf-2.3.1.tar.gz", hash = "sha256:e5e7de64aeebeddaf8e6d3f7a783b32ac2a01c0fbd9c878012caecb891a1f42a", size = 3298472, upload-time = "2026-06-11T05:05:12.885Z" } wheels = [ @@ -4375,20 +4383,20 @@ resolution-markers = [ "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] dependencies = [ - { name = "anyio", version = "4.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13.14'" }, - { name = "distro", marker = "python_full_version < '3.13.14'" }, - { name = "httpx", marker = "python_full_version < '3.13.14'" }, - { name = "jiter", marker = "python_full_version < '3.13.14'" }, - { name = "pydantic", marker = "python_full_version < '3.13.14'" }, - { name = "sniffio", marker = "python_full_version < '3.13.14'" }, - { name = "tqdm", marker = "python_full_version < '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version < '3.13.14'" }, + { name = "anyio", version = "4.14.2", source = { registry = "https://pypi.org/simple" } }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/88/15/52580c8fbc16d0675d516e8749806eda679b16de1e4434ea06fb6feaa610/openai-2.30.0.tar.gz", hash = "sha256:92f7661c990bda4b22a941806c83eabe4896c3094465030dd882a71abe80c885", size = 676084, upload-time = "2026-03-25T22:08:59.96Z" } wheels = [ @@ -4400,20 +4408,22 @@ name = "openai" version = "2.44.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform == 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform != 'win32'", ] dependencies = [ - { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "distro", marker = "python_full_version >= '3.13.14'" }, - { name = "httpx", marker = "python_full_version >= '3.13.14'" }, - { name = "jiter", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, - { name = "sniffio", marker = "python_full_version >= '3.13.14'" }, - { name = "tqdm", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, + { name = "anyio", version = "4.15.1", source = { registry = "https://pypi.org/simple" } }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/49/f5/7c7cb955305cb41f7f3c5fd7e0e38bf6bbf2658468863d4b7b868a5cb8df/openai-2.44.0.tar.gz", hash = "sha256:68a5a5ffad82b8ff7d451c437529fb64f7c3b8123aaf0c021966a882d9e3947d", size = 988753, upload-time = "2026-06-24T20:56:02.293Z" } wheels = [ @@ -4437,9 +4447,9 @@ name = "opencensus" version = "0.11.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "google-api-core", marker = "python_full_version >= '3.13.14'" }, - { name = "opencensus-context", marker = "python_full_version >= '3.13.14'" }, - { name = "six", marker = "python_full_version >= '3.13.14'" }, + { name = "google-api-core" }, + { name = "opencensus-context" }, + { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/15/a7/a46dcffa1b63084f9f17fe3c8cb20724c4c8f91009fd0b2cfdb27d5d2b35/opencensus-0.11.4.tar.gz", hash = "sha256:cbef87d8b8773064ab60e5c2a1ced58bbaa38a6d052c41aec224958ce544eff2", size = 64966, upload-time = "2024-01-03T18:04:07.085Z" } wheels = [ @@ -4533,9 +4543,9 @@ name = "opentelemetry-exporter-prometheus" version = "0.65b0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-api", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-sdk", marker = "python_full_version >= '3.13.14'" }, - { name = "prometheus-client", marker = "python_full_version >= '3.13.14'" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-sdk" }, + { name = "prometheus-client" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f4/85/3a1af7b90a76d6c069bcbbc86cc641c93d15057f2674cc8226f47c5260e8/opentelemetry_exporter_prometheus-0.65b0.tar.gz", hash = "sha256:2777cbf41c403c119e10f418fce5d645c956b47f673a2ee120285d1d0c6df2d5", size = 16411, upload-time = "2026-07-16T15:25:39.971Z" } wheels = [ @@ -4688,9 +4698,9 @@ resolution-markers = [ "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } @@ -4703,8 +4713,10 @@ name = "packaging" version = "26.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform == 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform != 'win32'", ] @@ -4901,7 +4913,7 @@ name = "prettytable" version = "3.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wcwidth", marker = "python_full_version >= '3.13.14'" }, + { name = "wcwidth" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/74/ba08d81e668ccfe8658d7520a307e63c19862c08eb4ccb26f356c5239a7a/prettytable-3.18.0.tar.gz", hash = "sha256:439217116152244369caf3d9f1caf2f9fe29b03bd79e88d2928c8e718c95d680", size = 76373, upload-time = "2026-06-22T16:07:50.174Z" } wheels = [ @@ -5228,8 +5240,10 @@ name = "pyarrow" version = "25.0.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform == 'win32'", "python_full_version >= '3.13.14' and python_full_version < '3.14' and sys_platform != 'win32'", ] @@ -5280,9 +5294,9 @@ resolution-markers = [ "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '3.13.14' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/ec/34/17c34cb38e5d940e38f0f0d9fdfa0e8a506676409ea9b85aff7e3079f831/pyarrow-26.0.0.tar.gz", hash = "sha256:0cccd36e00ea3afeb52ded61f2721ce71f604853d70c45365c58324eb773d6ae", size = 1239433, upload-time = "2026-10-09T08:26:25.315Z" } @@ -5540,7 +5554,7 @@ name = "pydot" version = "4.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyparsing", marker = "python_full_version >= '3.13.14'" }, + { name = "pyparsing" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/35/b17cb89ff865484c6a20ef46bf9d95a5f07328292578de0b295f4a6beec2/pydot-4.0.1.tar.gz", hash = "sha256:c2148f681c4a33e08bf0e26a9e5f8e4099a82e0e2a068098f32ce86577364ad5", size = 162594, upload-time = "2025-06-17T20:09:56.454Z" } wheels = [ @@ -5661,7 +5675,7 @@ name = "pyobjc-framework-cocoa" version = "13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "pyobjc-core" }, ] sdist = { url = "https://files.pythonhosted.org/packages/30/50/55a8779d35f1f86d795264cbd6fe62e35b2cf4fb8343fc888e99268c988a/pyobjc_framework_cocoa-13.0.tar.gz", hash = "sha256:bb7a23941fc8d7866578dbc84e56140efd343a1d28510f530dd1dbf80807daf4", size = 3135308, upload-time = "2026-10-30T10:46:03.982Z" } wheels = [ @@ -5680,8 +5694,8 @@ name = "pyobjc-framework-coremedia" version = "13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/10/f6/3ccdac27fd6a2a94ae122b807a6f0512076614b85265559a9055996b5839/pyobjc_framework_coremedia-13.0.tar.gz", hash = "sha256:d95ef87f6f33ec98347439284f0add1f7d1d019b88cb8e218e81b39aec14d324", size = 99534, upload-time = "2026-10-30T10:46:14.941Z" } wheels = [ @@ -5700,8 +5714,8 @@ name = "pyobjc-framework-quartz" version = "13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/86/ffaa76ca28df5450cce14614c657b910bbd7bb737feaf47f74230c3b78d3/pyobjc_framework_quartz-13.0.tar.gz", hash = "sha256:b9a4942182efbbc7e18e6cb7f5a8faa166dc2fc5e33bece7c7b1355494274add", size = 3399243, upload-time = "2026-10-30T10:47:23.667Z" } wheels = [ @@ -5720,9 +5734,9 @@ name = "pyobjc-framework-screencapturekit" version = "13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, - { name = "pyobjc-framework-cocoa", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, - { name = "pyobjc-framework-coremedia", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/b3/2a38e35a2d0b7703e6a3c0a03c4e4854f1ea700b930ad50cf8fe34de1aec/pyobjc_framework_screencapturekit-13.0.tar.gz", hash = "sha256:036ee91a5566c053117120c423c747becdd803906dae1822c537ea61af976273", size = 40818, upload-time = "2026-10-30T10:47:29.126Z" } wheels = [ @@ -5901,7 +5915,7 @@ name = "python-discovery" version = "1.6.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", marker = "python_full_version >= '3.13.14'" }, + { name = "filelock" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/0b/908da9ef8a14b600fc188eee8d63ede071996114613721153f6fc9ea3cd5/python_discovery-1.6.7.tar.gz", hash = "sha256:7f7c28568c8ec3d988d8bddbdbec8e65f08e8767e52f734e18b8b498549b9b70", size = 117807, upload-time = "2026-10-28T06:24:21.878Z" } wheels = [ @@ -6072,14 +6086,14 @@ name = "ray" version = "2.59.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "python_full_version >= '3.13.14'" }, - { name = "filelock", marker = "python_full_version >= '3.13.14'" }, - { name = "jsonschema", marker = "python_full_version >= '3.13.14'" }, - { name = "msgpack", marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "protobuf", marker = "python_full_version >= '3.13.14'" }, - { name = "pyyaml", marker = "python_full_version >= '3.13.14'" }, - { name = "requests", marker = "python_full_version >= '3.13.14'" }, + { name = "click" }, + { name = "filelock" }, + { name = "jsonschema" }, + { name = "msgpack" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "protobuf" }, + { name = "pyyaml" }, + { name = "requests" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/e2/4b/c57f711b3d5a2492b39e25195075008d45edf4e045a08d8ece972b24fef6/ray-2.59.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cedce6af865d078d318bc3f691e41527331d532dca0017fb824191c884e59a22", size = 67431449, upload-time = "2026-10-02T07:02:24.125Z" }, @@ -6102,20 +6116,20 @@ wheels = [ [package.optional-dependencies] default = [ - { name = "aiohttp", marker = "python_full_version >= '3.13.14'" }, - { name = "aiohttp-cors", marker = "python_full_version >= '3.13.14'" }, - { name = "colorful", marker = "python_full_version >= '3.13.14'" }, - { name = "grpcio", marker = "python_full_version >= '3.13.14'" }, - { name = "opencensus", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-exporter-prometheus", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-proto", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-sdk", marker = "python_full_version >= '3.13.14'" }, - { name = "prometheus-client", marker = "python_full_version >= '3.13.14'" }, - { name = "py-spy", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, - { name = "requests", marker = "python_full_version >= '3.13.14'" }, - { name = "smart-open", marker = "python_full_version >= '3.13.14'" }, - { name = "virtualenv", marker = "python_full_version >= '3.13.14'" }, + { name = "aiohttp" }, + { name = "aiohttp-cors" }, + { name = "colorful" }, + { name = "grpcio" }, + { name = "opencensus" }, + { name = "opentelemetry-exporter-prometheus" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "prometheus-client" }, + { name = "py-spy" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "smart-open" }, + { name = "virtualenv" }, ] [[package]] @@ -6508,11 +6522,11 @@ name = "scikit-learn" version = "1.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "joblib", marker = "python_full_version >= '3.13.14'" }, - { name = "narwhals", marker = "python_full_version >= '3.13.14'" }, - { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "scipy", marker = "python_full_version >= '3.13.14'" }, - { name = "threadpoolctl", marker = "python_full_version >= '3.13.14'" }, + { name = "joblib" }, + { name = "narwhals" }, + { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" } }, + { name = "scipy" }, + { name = "threadpoolctl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d2/eb/eaf5e07fcc0da7149b0e084f24e54edd7441b9a89ce7e034032ae97fe3a0/scikit_learn-1.9.1.tar.gz", hash = "sha256:629cada3e33e2b9bf376cdc7614a47a4140b8aedc1d836579e359736fbd82977", size = 7786908, upload-time = "2026-09-10T18:34:04.679Z" } wheels = [ @@ -6565,7 +6579,7 @@ name = "scipy" version = "1.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, + { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/7e/74/66de6258867beb2ef08f35f9f2ac017a52cacd5081714d239ff1a442d458/scipy-1.18.1.tar.gz", hash = "sha256:52c4b7422442aba924d03ad4019852b08a92e64ea187b933135687bfe2747307", size = 30781235, upload-time = "2026-08-21T23:28:50.599Z" } wheels = [ @@ -6636,8 +6650,8 @@ name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, - { name = "jeepney", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "cryptography" }, + { name = "jeepney" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ @@ -6697,11 +6711,11 @@ name = "skops" version = "0.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "prettytable", marker = "python_full_version >= '3.13.14'" }, - { name = "scikit-learn", marker = "python_full_version >= '3.13.14'" }, - { name = "scipy", marker = "python_full_version >= '3.13.14'" }, + { name = "numpy", version = "2.5.4", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "prettytable" }, + { name = "scikit-learn" }, + { name = "scipy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/52/4b/7fef0af1efcb06c0986762645fb414ad850314a891434a2bbaea12a962ea/skops-0.16.0.tar.gz", hash = "sha256:58ddb63fed9f2a8545baa1a91c45c26d44cf65c83e2fd217541c41e411cf1d74", size = 673544, upload-time = "2026-09-24T06:29:46.96Z" } wheels = [ @@ -6713,7 +6727,7 @@ name = "smart-open" version = "9.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wrapt", marker = "python_full_version >= '3.13.14'" }, + { name = "wrapt" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/fb/19b6597c88ed450aa48e903b0043cdfd8e1d483b1dd78fb2a7b10897cf94/smart_open-9.0.1.tar.gz", hash = "sha256:9dd0de10c98c7dfc6c05096fb8bc5ef3ed280c994ec2aa8fb747ab14bd528804", size = 65045, upload-time = "2026-10-29T20:08:21.912Z" } wheels = [ @@ -6762,7 +6776,7 @@ name = "sqlalchemy" version = "2.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/36/dc/9addbf490110b5727380059ee542ad8353bdcee45a37ba6a5e0976966ae0/sqlalchemy-2.1.6.tar.gz", hash = "sha256:499eae5c9051efe96cb9a73ec2fbde8ffa4186f102b9094ebab8fcc9d3b99f52", size = 10589700, upload-time = "2026-10-21T16:25:06.497Z" } wheels = [ @@ -6878,14 +6892,14 @@ wheels = [ [[package]] name = "synchronicity" -version = "0.12.6" +version = "0.12.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ee/5f/9f6f7df5919f0d085013b96b9cb99b622b974fe722a04c126c10497bba8b/synchronicity-0.12.6.tar.gz", hash = "sha256:ac971eadb64c95938816b8d6125d6e28473982f3256789a35bdbe02025e1ce17", size = 62425, upload-time = "2026-10-02T15:41:43.739Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/0d/68d6a97dead45e2704cd431df2ed5f92c9bdea620239d6129b16becc7508/synchronicity-0.12.7.tar.gz", hash = "sha256:6d86ba0fb797cc3cb7637f97cf9472a3ed20e50e85130b44c3292b43e2389b90", size = 63402, upload-time = "2026-10-26T16:56:34.492Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/9c/8408129632f2cbd70018cff4a7eb78cc105b141de233b699feeda15d44c9/synchronicity-0.12.6-py3-none-any.whl", hash = "sha256:bc2bab6dde31f6bd9389912cef573b7fa7a5cb4a120ec786275e3284f06473ae", size = 41971, upload-time = "2026-10-02T15:41:42.672Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c8/fb85647116e63031344b65f16ebfcc263f30bd46c12266e70bc9a96cdc7d/synchronicity-0.12.7-py3-none-any.whl", hash = "sha256:75f1a4e91a6af24b6576c242d95e9f1bcf061fab90feb8d1d3a6fa54b349a77d", size = 42245, upload-time = "2026-10-26T16:56:32.903Z" }, ] [[package]] @@ -7370,11 +7384,11 @@ name = "virtualenv" version = "21.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "distlib", marker = "python_full_version >= '3.13.14'" }, - { name = "filelock", marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "platformdirs", marker = "python_full_version >= '3.13.14'" }, - { name = "python-discovery", marker = "python_full_version >= '3.13.14'" }, + { name = "distlib" }, + { name = "filelock" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "platformdirs" }, + { name = "python-discovery" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b2/24/20282bc8e69ff8dee680dc2b95e9dc81fa7e7894b14c1a8d06330e97fef7/virtualenv-21.15.1.tar.gz", hash = "sha256:e79c90b8f601701599c25905e02839924fede2c798d52325670d24fbdaab74ee", size = 5517048, upload-time = "2026-10-28T01:12:50.919Z" } wheels = [ @@ -7395,19 +7409,19 @@ name = "wandb" version = "0.31.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "python_full_version >= '3.13.14'" }, - { name = "cwevals", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-api", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version >= '3.13.14'" }, - { name = "opentelemetry-sdk", marker = "python_full_version >= '3.13.14'" }, - { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13.14'" }, - { name = "platformdirs", marker = "python_full_version >= '3.13.14'" }, - { name = "protobuf", marker = "python_full_version >= '3.13.14'" }, - { name = "pydantic", marker = "python_full_version >= '3.13.14'" }, - { name = "pyyaml", marker = "python_full_version >= '3.13.14'" }, - { name = "requests", marker = "python_full_version >= '3.13.14'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13.14'" }, - { name = "xxhash", marker = "python_full_version >= '3.13.14'" }, + { name = "click" }, + { name = "cwevals" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-http" }, + { name = "opentelemetry-sdk" }, + { name = "packaging", version = "26.3", source = { registry = "https://pypi.org/simple" } }, + { name = "platformdirs" }, + { name = "protobuf" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "typing-extensions" }, + { name = "xxhash" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/a5/8fc1c319f2db9be5a707c25a76ecba1b2b9450a44a05b295ff5aa379bbfa/wandb-0.31.0.tar.gz", hash = "sha256:dcdaa635576ff17b18a757b39fc22b0db3d1c6e01d5ce090fe80f6adc776028d", size = 40420416, upload-time = "2026-10-16T18:56:13.817Z" } wheels = [ From ad3525c81121c44ff46143a5f14c370955c0cc16 Mon Sep 17 00:00:00 2001 From: Jonathon Belotti Date: Sat, 7 Nov 2026 13:24:54 -0500 Subject: [PATCH 2/2] refactor(modal): use public sandbox and registry APIs --- .../sandbox_providers/modal_sandbox.py | 26 +++++-------- .../sandbox_providers/modal_vm_sandbox.py | 8 ++-- .../attribution_wire_test.py | 2 +- .../modal_context_build_test.py | 4 +- .../modal_create_signature_test.py | 10 +++-- .../modal_gpu_sandbox_test.py | 6 +-- .../modal_network_policy_wiring_test.py | 4 +- .../modal_sandbox_started_log_test.py | 2 +- .../modal_sandbox_tags_test.py | 4 +- .../sandbox_providers/modal_sandbox_test.py | 39 +++++++++---------- .../modal_vm_sandbox_test.py | 4 +- .../network_policy_stamping_test.py | 2 +- 12 files changed, 53 insertions(+), 58 deletions(-) diff --git a/src/agent_env/providers/sandbox_providers/modal_sandbox.py b/src/agent_env/providers/sandbox_providers/modal_sandbox.py index 02c524925..35fe40c92 100644 --- a/src/agent_env/providers/sandbox_providers/modal_sandbox.py +++ b/src/agent_env/providers/sandbox_providers/modal_sandbox.py @@ -99,7 +99,7 @@ async def _terminate_by_id(client, sandbox_id: str) -> None: def _modal_network_kwargs(policy: NetworkPolicy) -> dict: - """``policy`` as Modal ``_experimental_create`` kwargs. + """``policy`` as Modal sandbox creation kwargs. ALLOW_ALL contributes nothing: passing ``outbound_domain_allowlist`` at all flips Modal OPEN -> ALLOWLIST and drops raw-IP egress, even for ``["*"]``. @@ -249,11 +249,7 @@ def __init__( self._ecr_pull_secret_name = ecr_pull_secret_name self._environment_name = environment_name self._client: Optional[modal.Client] = None - # Optional Modal GPU spec (e.g. "H100", "A100", "H100:2"). When set, create_container - # provisions the sandbox with the V1 ``modal.Sandbox.create`` factory (which accepts - # ``gpu=`` + docker-in-gVisor) instead of the V2 ``_experimental_create``, which - # cannot attach a GPU. V1 has no ``i6pn``, so a GPU sandbox has no private-IPv6 - # east-west networking (fine for a single sandbox; not for an i6pn mesh). + # GPU sandboxes use the V1 backend, which supports Docker in gVisor but not i6pn. self._gpu = gpu # Looked up on demand and cached by name. self._apps: dict[str, modal.App] = {} @@ -334,11 +330,7 @@ async def create_container( # The private network is i6pn, Modal's network between sandboxes, in the configured region. i6pn = private_network region = get_config().modal_default_region if private_network else None - # GPU sandboxes need the V1 ``Sandbox.create`` factory: the V2 - # ``_experimental_create`` has no ``gpu`` parameter and cannot attach one. V1 in - # turn has no ``i6pn``, so reject that combination up front — before any Modal - # call — rather than silently returning one whose i6pn_address is None - # and failing downstream (e.g. the gateway's "service-db has no i6pn address"). + # The GPU backend does not support private IPv6 networking. if self._gpu and i6pn: raise ValueError( "i6pn is unavailable on GPU sandboxes: the GPU-capable factory " @@ -375,7 +367,7 @@ async def create_container( f"app={app_name} region={region} i6pn={i6pn}" ) - # ``i6pn`` is threaded per-factory below (V2 only); everything else is shared. + # Private networking requires the experimental factory; other calls use the public API. create_kwargs = dict( app=app, cpu=cpu, memory=memory, timeout=timeout, env=env or {}, client=client, **port_kwargs, @@ -395,9 +387,11 @@ async def create(image: modal.Image) -> modal.Sandbox: image=image, **create_kwargs, ) - return await modal.Sandbox._experimental_create.aio( - *(command or []), i6pn=i6pn, image=image, **create_kwargs - ) + if i6pn: + return await modal.Sandbox._experimental_create.aio( + *(command or []), i6pn=True, image=image, **create_kwargs + ) + return await modal.Sandbox.create.aio(*(command or []), image=image, **create_kwargs) async def create_rebuilding_once() -> modal.Sandbox: try: @@ -515,7 +509,7 @@ async def _registry_image(self, image_name: str) -> modal.Image: ) auth = None if uses_ecr_pull_secret else await asyncio.to_thread(image_store.auth, image_name) if uses_ecr_pull_secret: - return modal.Image.from_aws_ecr(image_name, secret=modal.Secret.from_name( + return modal.Image.from_registry(image_name, secret=modal.Secret.from_name( self._ecr_pull_secret_name, required_keys=ECR_READER_SECRET_KEYS, environment_name=self._environment_name)) if auth is not None: diff --git a/src/agent_env/providers/sandbox_providers/modal_vm_sandbox.py b/src/agent_env/providers/sandbox_providers/modal_vm_sandbox.py index 10057a1b0..f2280dfd9 100644 --- a/src/agent_env/providers/sandbox_providers/modal_vm_sandbox.py +++ b/src/agent_env/providers/sandbox_providers/modal_vm_sandbox.py @@ -2,7 +2,7 @@ This is the Modal analogue of a KubeVirt-style one-VM provider rather than of the container-per-service ModalSandboxProvider. It provisions a single Modal VM sandbox -(`experimental_options={"vm_runtime": True}` → real Linux kernel + nested Docker), +(`runtime="vm"` → real Linux kernel + nested Docker), so the gateway's VM path (`EnvironmentGatewayProvider._deploy_via_vm`) can `docker compose up` the whole stack (postgres + N MCP servers + gateway) inside one box behind one tunnel. @@ -123,7 +123,7 @@ class ModalVmSandbox(VmSandbox): - """A Modal VM sandbox (vm_runtime) presented through the VmSandbox contract. + """A Modal VM sandbox (runtime="vm") presented through the VmSandbox contract. Subclasses VmSandbox so it inherits exec_script / load_docker_images / load_object_file / write_file_* unchanged — they are built on exec_with_output -> @@ -363,7 +363,7 @@ async def create_vm( return await self._created(_KEEPALIVE_CMD, _VM_IMAGE, cpu=cpu, memory=memory, timeout=timeout, ports=ports, attribution=attribution, network_policy=network_policy, setup_for_gateway=setup_for_gateway, idle_timeout=self._idle_timeout, - experimental_options={"vm_runtime": True}) + runtime="vm") (platform,) = self.disk_image_platforms() disk = await asyncio.to_thread(exported_disk, image, platform) variables = {**launcher_variables(ports, env or {}, cpu, memory), "VM_DISK": _MOUNTED_DISK} @@ -404,7 +404,7 @@ async def _created(self, command: tuple[str, ...], image: modal.Image, *, cpu: f # (retry_transient is documented for read-only calls only). Modal's client already # retries RESOURCE_EXHAUSTED / queueing internally, which is the real high-load case. try: - sb = await modal.Sandbox._experimental_create.aio( + sb = await modal.Sandbox.create.aio( *command, app=app, image=image, cpu=cpu, memory=memory, timeout=timeout, encrypted_ports=ports, client=client, diff --git a/tst/unit/providers/sandbox_providers/attribution_wire_test.py b/tst/unit/providers/sandbox_providers/attribution_wire_test.py index ad26aceb9..d2533b4d7 100644 --- a/tst/unit/providers/sandbox_providers/attribution_wire_test.py +++ b/tst/unit/providers/sandbox_providers/attribution_wire_test.py @@ -106,7 +106,7 @@ def _provider(): async def test_the_shared_app_gets_the_defaults_and_the_sandbox_gets_the_run(): provider = _provider() attribution = {"team": "t", "cost_center": "research", RUN_ID_KEY: "inst-1"} - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as create: create.aio = AsyncMock(side_effect=RuntimeError("stop")) with pytest.raises(RuntimeError): await provider.create_container(image_name="img:latest", port=8000, env={}, attribution=attribution) diff --git a/tst/unit/providers/sandbox_providers/modal_context_build_test.py b/tst/unit/providers/sandbox_providers/modal_context_build_test.py index 2d88c4625..79e9920cd 100644 --- a/tst/unit/providers/sandbox_providers/modal_context_build_test.py +++ b/tst/unit/providers/sandbox_providers/modal_context_build_test.py @@ -235,10 +235,10 @@ async def test_an_image_modal_pulls_drops_one_prepared_earlier_under_its_name(lo def _fake_create(): - """A patched ``modal.Sandbox._experimental_create`` that stops right after recording its call.""" + """A patched ``modal.Sandbox.create`` that stops right after recording its call.""" create = MagicMock() create.aio = AsyncMock(side_effect=RuntimeError("stop")) - return patch.object(modal_sandbox.modal.Sandbox, "_experimental_create", create) + return patch.object(modal_sandbox.modal.Sandbox, "create", create) @pytest.mark.asyncio diff --git a/tst/unit/providers/sandbox_providers/modal_create_signature_test.py b/tst/unit/providers/sandbox_providers/modal_create_signature_test.py index 509857c4e..ef36dd917 100644 --- a/tst/unit/providers/sandbox_providers/modal_create_signature_test.py +++ b/tst/unit/providers/sandbox_providers/modal_create_signature_test.py @@ -43,16 +43,18 @@ def _provider(cls, **kwargs): _CREATES = { - "container": (ModalSandboxProvider, {}, "_experimental_create", lambda p: p.create_container( + "private container": (ModalSandboxProvider, {}, "_experimental_create", lambda p: p.create_container( image_name="img:latest", port=8000, env={"A": "1"}, network_policy=_ALLOWLIST, attribution=_ATTRIBUTION, private_network=True)), + "container": (ModalSandboxProvider, {}, "create", lambda p: p.create_container( + image_name="img:latest", port=8000, env={"A": "1"}, network_policy=_ALLOWLIST, attribution=_ATTRIBUTION)), "gpu container": (ModalSandboxProvider, {"gpu": "H100"}, "create", lambda p: p.create_container( image_name="img:latest", port=8000, env={"A": "1"}, network_policy=_ALLOWLIST, attribution=_ATTRIBUTION)), - "vm": (ModalVmSandboxProvider, {}, "_experimental_create", lambda p: p.create_vm( + "vm": (ModalVmSandboxProvider, {}, "create", lambda p: p.create_vm( exposed_ports=[8000], network_policy=_ALLOWLIST, attribution=_ATTRIBUTION)), - "vm in a region": (ModalVmSandboxProvider, {"region": "us-west", "idle_timeout": 600}, "_experimental_create", + "vm in a region": (ModalVmSandboxProvider, {"region": "us-west", "idle_timeout": 600}, "create", lambda p: p.create_vm(exposed_ports=[8000], attribution=_ATTRIBUTION)), - "disk": (ModalVmSandboxProvider, {"region": "us-west"}, "_experimental_create", lambda p: p.create_vm( + "disk": (ModalVmSandboxProvider, {"region": "us-west"}, "create", lambda p: p.create_vm( image="localhost:5000/disk@sha256:" + "a" * 64, env={"ENVIRONMENT_NAME": "desk"}, exposed_ports=[18765], cpu=2, memory=4096, network_policy=_ALLOWLIST, attribution=_ATTRIBUTION)), } diff --git a/tst/unit/providers/sandbox_providers/modal_gpu_sandbox_test.py b/tst/unit/providers/sandbox_providers/modal_gpu_sandbox_test.py index 13e0d58a0..46e6c85ff 100644 --- a/tst/unit/providers/sandbox_providers/modal_gpu_sandbox_test.py +++ b/tst/unit/providers/sandbox_providers/modal_gpu_sandbox_test.py @@ -1,8 +1,8 @@ """GPU support on ModalSandboxProvider. A ``gpu`` spec must route create_container through the V1 ``modal.Sandbox.create`` factory -(the only one that accepts ``gpu=``), with docker-in-gVisor enabled; the default path must -stay on V2 ``_experimental_create`` with ``i6pn`` unchanged. ``gpu`` + ``i6pn`` is +(the only one that accepts ``gpu=``), with docker-in-gVisor enabled; private networking uses +``_experimental_create`` with ``i6pn`` enabled. ``gpu`` + ``i6pn`` is unsatisfiable (V1 has no i6pn) and must fail before a sandbox is created. """ @@ -55,7 +55,7 @@ async def test_gpu_uses_v1_create_with_gpu_and_docker_in_gvisor(): @pytest.mark.asyncio -async def test_default_stays_on_v2_experimental_create_with_i6pn(): +async def test_private_network_uses_experimental_create_with_i6pn(): captured, fake = _capture() provider = _provider() # no gpu with _patched("modal.Sandbox._experimental_create", fake), pytest.raises(Exception): diff --git a/tst/unit/providers/sandbox_providers/modal_network_policy_wiring_test.py b/tst/unit/providers/sandbox_providers/modal_network_policy_wiring_test.py index 4eae913d0..77d2ddfaa 100644 --- a/tst/unit/providers/sandbox_providers/modal_network_policy_wiring_test.py +++ b/tst/unit/providers/sandbox_providers/modal_network_policy_wiring_test.py @@ -1,7 +1,7 @@ """The allowlist must actually reach Modal's create call. modal_network_policy_test.py covers the lowering as a pure function; that passes even if -neither backend spreads the result into _experimental_create. Modal is the only backend +neither backend spreads the result into create. Modal is the only backend that enforces anything, so losing that spread would provision open while the deployment record still claimed the allowlist. """ @@ -33,7 +33,7 @@ async def fake_create(*args, **kwargs): def _patched_create(fake): create = MagicMock() create.aio = fake - return patch("modal.Sandbox._experimental_create", create) + return patch("modal.Sandbox.create", create) @pytest.mark.asyncio diff --git a/tst/unit/providers/sandbox_providers/modal_sandbox_started_log_test.py b/tst/unit/providers/sandbox_providers/modal_sandbox_started_log_test.py index 41494a233..4180cd8f2 100644 --- a/tst/unit/providers/sandbox_providers/modal_sandbox_started_log_test.py +++ b/tst/unit/providers/sandbox_providers/modal_sandbox_started_log_test.py @@ -85,7 +85,7 @@ async def test_create_container_emits_the_started_line(caplog): provider = ModalSandboxProvider(app_name="agent-env-test") provider._get_app = AsyncMock(return_value=MagicMock()) # type: ignore[method-assign] provider._get_client = AsyncMock(return_value=MagicMock()) # type: ignore[method-assign] - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as create, \ + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as create, \ caplog.at_level(logging.INFO, logger="agent_env.providers.sandbox_providers.modal_sandbox"): create.aio = AsyncMock(return_value=_fake_sb()) await provider.create_container(image_name="img:latest", port=8000, env={}, attribution=_TAGS) diff --git a/tst/unit/providers/sandbox_providers/modal_sandbox_tags_test.py b/tst/unit/providers/sandbox_providers/modal_sandbox_tags_test.py index 2eca1e742..a95a27082 100644 --- a/tst/unit/providers/sandbox_providers/modal_sandbox_tags_test.py +++ b/tst/unit/providers/sandbox_providers/modal_sandbox_tags_test.py @@ -121,7 +121,7 @@ def _patch_clients(provider): ) async def test_container_create_passes_sandbox_tags(attribution, expected): provider = _patch_clients(ModalSandboxProvider(app_name="agent-env-test")) - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as create: create.aio = AsyncMock(side_effect=_StopAfterCreate()) with pytest.raises(RuntimeError): await provider.create_container( @@ -146,7 +146,7 @@ async def test_gpu_container_create_passes_sandbox_tags(): @pytest.mark.asyncio async def test_vm_create_passes_sandbox_tags(): provider = _patch_clients(ModalVmSandboxProvider(app_name="agent-env-test")) - with patch("agent_env.providers.sandbox_providers.modal_vm_sandbox.modal.Sandbox._experimental_create") as create: + with patch("agent_env.providers.sandbox_providers.modal_vm_sandbox.modal.Sandbox.create") as create: create.aio = AsyncMock(side_effect=_StopAfterCreate()) with pytest.raises(RuntimeError): await provider.create_vm(attribution={PIPELINE_STEP_KEY: "t_s"}) diff --git a/tst/unit/providers/sandbox_providers/modal_sandbox_test.py b/tst/unit/providers/sandbox_providers/modal_sandbox_test.py index 82b0b0d73..f891bcbb2 100644 --- a/tst/unit/providers/sandbox_providers/modal_sandbox_test.py +++ b/tst/unit/providers/sandbox_providers/modal_sandbox_test.py @@ -85,7 +85,7 @@ async def test_create_container_wraps_post_create_failure_and_terminates(_patche fake_sb.terminate = MagicMock() fake_sb.terminate.aio = AsyncMock() - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(return_value=fake_sb) with pytest.raises(RuntimeError) as ei: @@ -110,7 +110,7 @@ async def test_create_container_terminates_a_sandbox_whose_create_is_cancelled(_ fake_sb.wait_until_ready.aio = AsyncMock(side_effect=asyncio.CancelledError) fake_sb.terminate.aio = AsyncMock() - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(return_value=fake_sb) with pytest.raises(asyncio.CancelledError): @@ -132,7 +132,7 @@ async def experimental_create(*args, **kwargs): await release.wait() return fake_sb - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(side_effect=experimental_create) create = asyncio.create_task( _patched_provider.create_container(image_name="registry.example/mcp-server-example:v1", port=18765, env={})) @@ -159,7 +159,7 @@ async def experimental_create(*args, **kwargs): await release.wait() return fake_sb - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(side_effect=experimental_create) create = asyncio.create_task( _patched_provider.create_container(image_name="registry.example/mcp-server-example:v1", port=18765, env={})) @@ -186,7 +186,7 @@ async def experimental_create(*args, **kwargs): await release.wait() return fake_sb - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(side_effect=experimental_create) create = asyncio.create_task( provider.create_container(image_name="registry.example/mcp-server-example:v1", port=18765, env={})) @@ -234,7 +234,7 @@ async def gives_up_as_the_create_ends(awaitable, timeout): await awaitable raise TimeoutError - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(side_effect=experimental_create) create = asyncio.create_task( _patched_provider.create_container(image_name="registry.example/mcp-server-example:v1", port=18765, env={})) @@ -269,7 +269,7 @@ class _RemoteErrorWithMessage(Exception): pass inner_msg = "Image build for im-Xhe66qHlOEXQpwDyiiBuGX failed. See build logs." - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(side_effect=_RemoteErrorWithMessage(inner_msg)) with pytest.raises(RuntimeError) as ei: @@ -286,7 +286,7 @@ class _RemoteErrorWithMessage(Exception): @pytest.mark.asyncio async def test_create_container_handles_empty_args_exception(_patched_provider): - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(side_effect=_BareSandboxTimeoutError()) with pytest.raises(RuntimeError) as ei: @@ -303,7 +303,7 @@ async def test_create_container_handles_empty_args_exception(_patched_provider): @pytest.mark.asyncio async def test_image_auth_paths(_patched_provider): - """ECR -> from_aws_ecr + named secret; store-supplied creds -> docker login; else anonymous.""" + """Registry pulls use a named ECR secret, store-supplied login credentials, or anonymous access.""" from agent_env.config import get_config from agent_env.store import ( EcrCredentials, @@ -322,8 +322,8 @@ def mint(self, host): _patched_provider._environment_name = "rl-prod" p = lambda n: patch(f"agent_env.providers.sandbox_providers.modal_sandbox.modal.{n}") # noqa: E731 - with p("Image.from_aws_ecr") as aws_ecr, p("Image.from_registry") as registry, \ - p("Secret.from_name") as from_name, p("Sandbox._experimental_create") as create: + with p("Image.from_registry") as registry, \ + p("Secret.from_name") as from_name, p("Sandbox.create") as create: create.aio = AsyncMock(side_effect=_BareSandboxTimeoutError()) cases = ( ( @@ -348,15 +348,16 @@ def mint(self, host): with pytest.raises(RuntimeError): await _patched_provider.create_container(image_name=ref, port=1, env={}) - assert aws_ecr.call_args.args[0] == ecr + assert registry.call_args_list[0].args == (ecr,) + assert registry.call_args_list[0].kwargs["secret"] is from_name.return_value from_name.assert_called_once_with( "agent-env-ecr-reader", required_keys=["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION"], environment_name="rl-prod", ) - assert registry.call_args_list[0].kwargs["secret"] is not None - assert registry.call_args_list[1].args == ("pub.example/x:v1",) - assert registry.call_args_list[2].args == (f"{ecr_host}.attacker.example/x:v1",) + assert registry.call_args_list[1].kwargs["secret"] is not None + assert registry.call_args_list[2].args == ("pub.example/x:v1",) + assert registry.call_args_list[3].args == (f"{ecr_host}.attacker.example/x:v1",) @pytest.mark.asyncio @@ -380,9 +381,8 @@ async def test_unset_pull_secret_falls_back_to_minted_credentials(_patched_provi ) ) - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Image.from_aws_ecr") as aws_ecr, \ - patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Image.from_registry") as registry, \ - patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Image.from_registry") as registry, \ + patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as create: create.aio = AsyncMock(side_effect=_BareSandboxTimeoutError()) with pytest.raises(RuntimeError): await _patched_provider.create_container( @@ -391,7 +391,6 @@ async def test_unset_pull_secret_falls_back_to_minted_credentials(_patched_provi env={}, ) - aws_ecr.assert_not_called() assert registry.call_args.kwargs["secret"] is not None @@ -415,7 +414,7 @@ async def test_vnc_port_controls_the_tunnel_set_and_the_vnc_url( p: MagicMock(host=f"ta-x-{p}-y.w.modal.host", port=443) for p in (5000, 6080) }) - with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox._experimental_create") as mock_create: + with patch("agent_env.providers.sandbox_providers.modal_sandbox.modal.Sandbox.create") as mock_create: mock_create.aio = AsyncMock(return_value=fake_sb) sandbox = await _patched_provider.create_container( image_name="registry.example/vnc-image:v1", port=5000, env={}, vnc_port=vnc_port, diff --git a/tst/unit/providers/sandbox_providers/modal_vm_sandbox_test.py b/tst/unit/providers/sandbox_providers/modal_vm_sandbox_test.py index 00abfa117..222b7014d 100644 --- a/tst/unit/providers/sandbox_providers/modal_vm_sandbox_test.py +++ b/tst/unit/providers/sandbox_providers/modal_vm_sandbox_test.py @@ -440,7 +440,7 @@ async def create(*command, **kwargs): sb.exec.aio = AsyncMock(side_effect=AssertionError("a disk's sandbox runs nothing at create")) return sb - monkeypatch.setattr(mvs.modal.Sandbox, "_experimental_create", SimpleNamespace(aio=create)) + monkeypatch.setattr(mvs.modal.Sandbox, "create", SimpleNamespace(aio=create)) monkeypatch.setattr(mvs.modal.Secret, "from_dict", lambda variables: made.secrets.append(variables) or variables) monkeypatch.setattr(mvs, "exported_disk", lambda image, platform: made.exported.append((image, platform)) or Path("/cache/disk.img.zst")) @@ -497,7 +497,7 @@ async def test_a_configured_region_and_idle_timeout_hold_for_every_sandbox_the_p (_, disk), (_, agent), (_, gateway), (_, default) = modal_fake.creates assert [(kwargs.get("region"), kwargs.get("idle_timeout")) for kwargs in (disk, agent, gateway, default)] == [ ("us-west", 600), ("us-west", 600), ("us-west", 600), (None, None)] - assert agent["experimental_options"] == gateway["experimental_options"] == {"vm_runtime": True} + assert agent["runtime"] == gateway["runtime"] == "vm" @pytest.mark.asyncio diff --git a/tst/unit/providers/sandbox_providers/network_policy_stamping_test.py b/tst/unit/providers/sandbox_providers/network_policy_stamping_test.py index a637f45f6..d67e96cc9 100644 --- a/tst/unit/providers/sandbox_providers/network_policy_stamping_test.py +++ b/tst/unit/providers/sandbox_providers/network_policy_stamping_test.py @@ -52,7 +52,7 @@ def _modal_sb(): def _patched_create(sb): create = MagicMock() create.aio = AsyncMock(return_value=sb) - return patch("modal.Sandbox._experimental_create", create) + return patch("modal.Sandbox.create", create) async def _modal_vm() -> Sandbox: