modAL 1.3.1.dev13__tar.gz → 1.3.1.dev15__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/PKG-INFO +1 -1
  2. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/client.pyi +2 -2
  3. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/image.py +33 -10
  4. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/image.pyi +4 -0
  5. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/mount.py +7 -2
  6. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/mount.pyi +3 -3
  7. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_version/__init__.py +1 -1
  9. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/LICENSE +0 -0
  10. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/README.md +0 -0
  11. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/__init__.py +0 -0
  12. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/__main__.py +0 -0
  13. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_billing.py +0 -0
  14. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_clustered_functions.py +0 -0
  15. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_clustered_functions.pyi +0 -0
  16. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_container_entrypoint.py +0 -0
  17. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_functions.py +0 -0
  18. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_grpc_client.py +0 -0
  19. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_ipython.py +0 -0
  20. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_load_context.py +0 -0
  21. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_location.py +0 -0
  22. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_object.py +0 -0
  23. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_output.py +0 -0
  24. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_partial_function.py +0 -0
  25. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_pty.py +0 -0
  26. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_resolver.py +0 -0
  27. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_resources.py +0 -0
  28. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/__init__.py +0 -0
  29. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/asgi.py +0 -0
  30. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/container_io_manager.py +0 -0
  31. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/container_io_manager.pyi +0 -0
  32. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/execution_context.py +0 -0
  33. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/execution_context.pyi +0 -0
  34. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  35. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/telemetry.py +0 -0
  36. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/user_code_event_loop.py +0 -0
  37. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_runtime/user_code_imports.py +0 -0
  38. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_serialization.py +0 -0
  39. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_traceback.py +0 -0
  40. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_tunnel.py +0 -0
  41. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_tunnel.pyi +0 -0
  42. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_type_manager.py +0 -0
  43. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/__init__.py +0 -0
  44. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/app_utils.py +0 -0
  45. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/async_utils.py +0 -0
  46. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/auth_token_manager.py +0 -0
  47. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/blob_utils.py +0 -0
  48. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/bytes_io_segment_payload.py +0 -0
  49. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/deprecation.py +0 -0
  50. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/docker_utils.py +0 -0
  51. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/function_utils.py +0 -0
  52. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/git_utils.py +0 -0
  53. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/grpc_testing.py +0 -0
  54. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/grpc_utils.py +0 -0
  55. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/hash_utils.py +0 -0
  56. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/http_utils.py +0 -0
  57. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/jwt_utils.py +0 -0
  58. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/logger.py +0 -0
  59. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/mount_utils.py +0 -0
  60. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/name_utils.py +0 -0
  61. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/package_utils.py +0 -0
  62. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/pattern_utils.py +0 -0
  63. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/rand_pb_testing.py +0 -0
  64. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/shell_utils.py +0 -0
  65. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/task_command_router_client.py +0 -0
  66. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_utils/time_utils.py +0 -0
  67. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_vendor/__init__.py +0 -0
  68. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  69. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_vendor/cloudpickle.py +0 -0
  70. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_vendor/tblib.py +0 -0
  71. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/_watcher.py +0 -0
  72. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/app.py +0 -0
  73. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/app.pyi +0 -0
  74. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/billing.py +0 -0
  75. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/2023.12.312.txt +0 -0
  76. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/2023.12.txt +0 -0
  77. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/2024.04.txt +0 -0
  78. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/2024.10.txt +0 -0
  79. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/2025.06.txt +0 -0
  80. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/PREVIEW.txt +0 -0
  81. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/README.md +0 -0
  82. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/builder/base-images.json +0 -0
  83. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/call_graph.py +0 -0
  84. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/__init__.py +0 -0
  85. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/_download.py +0 -0
  86. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/_traceback.py +0 -0
  87. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/app.py +0 -0
  88. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/cluster.py +0 -0
  89. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/config.py +0 -0
  90. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/container.py +0 -0
  91. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/dict.py +0 -0
  92. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/entry_point.py +0 -0
  93. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/environment.py +0 -0
  94. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/import_refs.py +0 -0
  95. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/launch.py +0 -0
  96. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/network_file_system.py +0 -0
  97. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/profile.py +0 -0
  98. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/programs/__init__.py +0 -0
  99. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/programs/run_jupyter.py +0 -0
  100. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/programs/vscode.py +0 -0
  101. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/queues.py +0 -0
  102. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/run.py +0 -0
  103. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/secret.py +0 -0
  104. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/shell.py +0 -0
  105. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/token.py +0 -0
  106. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/utils.py +0 -0
  107. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cli/volume.py +0 -0
  108. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/client.py +0 -0
  109. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cloud_bucket_mount.py +0 -0
  110. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cloud_bucket_mount.pyi +0 -0
  111. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cls.py +0 -0
  112. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/cls.pyi +0 -0
  113. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/config.py +0 -0
  114. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/container_process.py +0 -0
  115. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/container_process.pyi +0 -0
  116. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/dict.py +0 -0
  117. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/dict.pyi +0 -0
  118. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/environments.py +0 -0
  119. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/environments.pyi +0 -0
  120. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/exception.py +0 -0
  121. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/experimental/__init__.py +0 -0
  122. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/experimental/flash.py +0 -0
  123. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/experimental/flash.pyi +0 -0
  124. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/experimental/ipython.py +0 -0
  125. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/file_io.py +0 -0
  126. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/file_io.pyi +0 -0
  127. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/file_pattern_matcher.py +0 -0
  128. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/functions.py +0 -0
  129. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/functions.pyi +0 -0
  130. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/gpu.py +0 -0
  131. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/io_streams.py +0 -0
  132. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/io_streams.pyi +0 -0
  133. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/network_file_system.py +0 -0
  134. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/network_file_system.pyi +0 -0
  135. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/object.py +0 -0
  136. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/object.pyi +0 -0
  137. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/output.py +0 -0
  138. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/parallel_map.py +0 -0
  139. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/parallel_map.pyi +0 -0
  140. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/partial_function.py +0 -0
  141. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/partial_function.pyi +0 -0
  142. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/proxy.py +0 -0
  143. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/proxy.pyi +0 -0
  144. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/py.typed +0 -0
  145. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/queue.py +0 -0
  146. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/queue.pyi +0 -0
  147. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/retries.py +0 -0
  148. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/runner.py +0 -0
  149. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/runner.pyi +0 -0
  150. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/running_app.py +0 -0
  151. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/sandbox.py +0 -0
  152. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/sandbox.pyi +0 -0
  153. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/schedule.py +0 -0
  154. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/scheduler_placement.py +0 -0
  155. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/secret.py +0 -0
  156. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/secret.pyi +0 -0
  157. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/serving.py +0 -0
  158. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/serving.pyi +0 -0
  159. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/snapshot.py +0 -0
  160. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/snapshot.pyi +0 -0
  161. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/stream_type.py +0 -0
  162. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/token_flow.py +0 -0
  163. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/token_flow.pyi +0 -0
  164. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/volume.py +0 -0
  165. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal/volume.pyi +0 -0
  166. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal.egg-info/SOURCES.txt +0 -0
  167. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal.egg-info/dependency_links.txt +0 -0
  168. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal.egg-info/entry_points.txt +0 -0
  169. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal.egg-info/requires.txt +0 -0
  170. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal.egg-info/top_level.txt +0 -0
  171. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_docs/__init__.py +0 -0
  172. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_docs/gen_cli_docs.py +0 -0
  173. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_docs/gen_reference_docs.py +0 -0
  174. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_docs/mdmd/__init__.py +0 -0
  175. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_docs/mdmd/mdmd.py +0 -0
  176. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_docs/mdmd/signatures.py +0 -0
  177. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/__init__.py +0 -0
  178. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/api.proto +0 -0
  179. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/api_grpc.py +0 -0
  180. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/api_pb2.py +0 -0
  181. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/api_pb2.pyi +0 -0
  182. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/api_pb2_grpc.py +0 -0
  183. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/api_pb2_grpc.pyi +0 -0
  184. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/modal_api_grpc.py +0 -0
  185. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/py.typed +0 -0
  186. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/task_command_router.proto +0 -0
  187. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/task_command_router_grpc.py +0 -0
  188. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/task_command_router_pb2.py +0 -0
  189. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/task_command_router_pb2.pyi +0 -0
  190. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  191. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  192. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/modal_version/__main__.py +0 -0
  193. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/pyproject.toml +0 -0
  194. {modal-1.3.1.dev13 → modal-1.3.1.dev15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.1.dev13
3
+ Version: 1.3.1.dev15
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.3.1.dev13",
36
+ version: str = "1.3.1.dev15",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.3.1.dev13",
166
+ version: str = "1.3.1.dev15",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -74,8 +74,8 @@ ImageBuilderVersion = Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVI
74
74
  # Python versions in mount.py where we specify the "standalone Python versions" we create mounts for.
75
75
  # Consider consolidating these multiple sources of truth?
76
76
  SUPPORTED_PYTHON_SERIES: dict[ImageBuilderVersion, list[str]] = {
77
- "PREVIEW": ["3.10", "3.11", "3.12", "3.13", "3.14"],
78
- "2025.06": ["3.10", "3.11", "3.12", "3.13", "3.14"],
77
+ "PREVIEW": ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
78
+ "2025.06": ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
79
79
  "2024.10": ["3.10", "3.11", "3.12", "3.13"],
80
80
  "2024.04": ["3.10", "3.11", "3.12"],
81
81
  "2023.12": ["3.10", "3.11", "3.12"],
@@ -104,15 +104,22 @@ See https://modal.com/docs/guide/modal-1-0-migration for more details.
104
104
 
105
105
 
106
106
  def _validate_python_version(
107
- python_version: Optional[str], builder_version: ImageBuilderVersion, allow_micro_granularity: bool = True
107
+ python_version: Optional[str],
108
+ builder_version: ImageBuilderVersion,
109
+ allow_micro_granularity: bool = True,
110
+ allow_free_threading: bool = False,
111
+ caller_name: str = "",
108
112
  ) -> str:
109
113
  if python_version is None:
110
114
  # If Python version is unspecified, match the local version, up to the minor component
111
115
  python_version = series_version = "{}.{}".format(*sys.version_info)
112
116
  elif not isinstance(python_version, str):
113
117
  raise InvalidError(f"Python version must be specified as a string, not {type(python_version).__name__}")
114
- elif not re.match(r"^3(?:\.\d{1,2}){1,2}(rc\d*)?$", python_version):
118
+ elif not re.match(r"^3(?:\.\d{1,2}){1,2}(rc\d*)?t?$", python_version):
115
119
  raise InvalidError(f"Invalid Python version: {python_version!r}")
120
+ elif not allow_free_threading and python_version.endswith("t"):
121
+ context = f"with {caller_name}" if caller_name else ""
122
+ raise InvalidError(f"Free threaded Python is not supported {context}")
116
123
  else:
117
124
  components = python_version.split(".")
118
125
  if len(components) == 3 and not allow_micro_granularity:
@@ -120,7 +127,8 @@ def _validate_python_version(
120
127
  "Python version must be specified as 'major.minor' for this interface;"
121
128
  f" micro-level specification ({python_version!r}) is not valid."
122
129
  )
123
- series_version = "{}.{}".format(*components)
130
+ suffix = "t" if len(components) == 3 and python_version.endswith("t") else ""
131
+ series_version = f"{components[0]}.{components[1]}{suffix}"
124
132
 
125
133
  supported_series = SUPPORTED_PYTHON_SERIES[builder_version]
126
134
  if series_version not in supported_series:
@@ -132,8 +140,15 @@ def _validate_python_version(
132
140
  return python_version
133
141
 
134
142
 
135
- def _dockerhub_python_version(builder_version: ImageBuilderVersion, python_version: Optional[str] = None) -> str:
136
- python_version = _validate_python_version(python_version, builder_version)
143
+ def _dockerhub_python_version(
144
+ builder_version: ImageBuilderVersion,
145
+ python_version: Optional[str] = None,
146
+ allow_free_threading: bool = False,
147
+ caller_name: str = "",
148
+ ) -> str:
149
+ python_version = _validate_python_version(
150
+ python_version, builder_version, allow_free_threading=allow_free_threading, caller_name=caller_name
151
+ )
137
152
  version_components = python_version.split(".")
138
153
 
139
154
  # When user specifies a full Python version, use that
@@ -1753,7 +1768,9 @@ class _Image(_Object, type_prefix="im"):
1753
1768
  """A Micromamba base image. Micromamba allows for fast building of small Conda-based containers."""
1754
1769
 
1755
1770
  def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
1756
- validated_python_version = _validate_python_version(python_version, version)
1771
+ validated_python_version = _validate_python_version(
1772
+ python_version, version, allow_free_threading=False, caller_name="Image.micromamba"
1773
+ )
1757
1774
  micromamba_version = _base_image_config("micromamba", version)
1758
1775
  tag = f"mambaorg/micromamba:{micromamba_version}"
1759
1776
  setup_commands = [
@@ -1833,12 +1850,16 @@ class _Image(_Object, type_prefix="im"):
1833
1850
  ) -> list[str]:
1834
1851
  add_python_commands: list[str] = []
1835
1852
  if add_python:
1836
- _validate_python_version(add_python, builder_version, allow_micro_granularity=False)
1853
+ _validate_python_version(
1854
+ add_python, builder_version, allow_micro_granularity=False, allow_free_threading=True
1855
+ )
1837
1856
  add_python_commands = [
1838
1857
  "COPY /python/. /usr/local",
1839
1858
  "ENV TERMINFO_DIRS=/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/usr/lib/terminfo",
1840
1859
  ]
1841
1860
  python_minor = add_python.split(".")[1]
1861
+ if python_minor.endswith("t"):
1862
+ python_minor = python_minor[:-1]
1842
1863
  if int(python_minor) < 13:
1843
1864
  # Previous versions did not include the `python` binary, but later ones do.
1844
1865
  # (The important factor is not the Python version itself, but the standalone dist version.)
@@ -2160,7 +2181,9 @@ class _Image(_Object, type_prefix="im"):
2160
2181
  if version <= "2024.10":
2161
2182
  requirements_path = _get_modal_requirements_path(version, python_version)
2162
2183
  context_files = {CONTAINER_REQUIREMENTS_PATH: requirements_path}
2163
- full_python_version = _dockerhub_python_version(version, python_version)
2184
+ full_python_version = _dockerhub_python_version(
2185
+ version, python_version, allow_free_threading=False, caller_name="Image.debian_slim"
2186
+ )
2164
2187
  debian_codename = _base_image_config("debian", version)
2165
2188
 
2166
2189
  commands = [
@@ -34,10 +34,14 @@ def _validate_python_version(
34
34
  python_version: typing.Optional[str],
35
35
  builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"],
36
36
  allow_micro_granularity: bool = True,
37
+ allow_free_threading: bool = False,
38
+ caller_name: str = "",
37
39
  ) -> str: ...
38
40
  def _dockerhub_python_version(
39
41
  builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"],
40
42
  python_version: typing.Optional[str] = None,
43
+ allow_free_threading: bool = False,
44
+ caller_name: str = "",
41
45
  ) -> str: ...
42
46
  def _base_image_config(
43
47
  group: str, builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"]
@@ -23,7 +23,11 @@ from ._load_context import LoadContext
23
23
  from ._object import _Object
24
24
  from ._resolver import Resolver
25
25
  from ._utils.async_utils import TaskContext, aclosing, async_map, synchronize_api
26
- from ._utils.blob_utils import FileUploadSpec, blob_upload_file, get_file_upload_spec_from_path
26
+ from ._utils.blob_utils import (
27
+ FileUploadSpec,
28
+ blob_upload_file,
29
+ get_file_upload_spec_from_path,
30
+ )
27
31
  from ._utils.grpc_utils import Retry
28
32
  from ._utils.name_utils import check_object_name
29
33
  from ._utils.package_utils import get_module_mount_info
@@ -45,6 +49,7 @@ PYTHON_STANDALONE_VERSIONS: dict[str, tuple[str, str]] = {
45
49
  "3.12": ("20240107", "3.12.1"),
46
50
  "3.13": ("20241008", "3.13.0"),
47
51
  "3.14": ("20251205", "3.14.2"),
52
+ "3.14t": ("20251209", "3.14.2t"),
48
53
  }
49
54
 
50
55
  MOUNT_DEPRECATION_MESSAGE_PATTERN = """modal.Mount usage will soon be deprecated.
@@ -797,7 +802,7 @@ async def _create_single_client_dependency_mount(
797
802
  tmpd,
798
803
  "--python-platform",
799
804
  uv_python_platform,
800
- "--python-version",
805
+ "--python",
801
806
  python_version,
802
807
  ]
803
808
  )
@@ -426,7 +426,7 @@ async def _create_single_client_dependency_mount(
426
426
  ): ...
427
427
  async def _create_client_dependency_mounts(
428
428
  client=None,
429
- python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14"],
429
+ python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
430
430
  builder_versions: list[str] = ["2025.06"],
431
431
  check_if_exists=True,
432
432
  dry_run=False,
@@ -437,7 +437,7 @@ class __create_client_dependency_mounts_spec(typing_extensions.Protocol):
437
437
  self,
438
438
  /,
439
439
  client=None,
440
- python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14"],
440
+ python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
441
441
  builder_versions: list[str] = ["2025.06"],
442
442
  check_if_exists=True,
443
443
  dry_run=False,
@@ -446,7 +446,7 @@ class __create_client_dependency_mounts_spec(typing_extensions.Protocol):
446
446
  self,
447
447
  /,
448
448
  client=None,
449
- python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14"],
449
+ python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
450
450
  builder_versions: list[str] = ["2025.06"],
451
451
  check_if_exists=True,
452
452
  dry_run=False,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.1.dev13
3
+ Version: 1.3.1.dev15
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.3.1.dev13"
4
+ __version__ = "1.3.1.dev15"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes