modAL 1.3.1.dev2__tar.gz → 1.3.1.dev4__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.dev2 → modal-1.3.1.dev4}/PKG-INFO +1 -1
  2. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/blob_utils.py +3 -9
  3. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/client.pyi +2 -2
  4. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal.egg-info/PKG-INFO +1 -1
  5. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_version/__init__.py +1 -1
  6. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/LICENSE +0 -0
  7. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/README.md +0 -0
  8. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/__init__.py +0 -0
  9. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/__main__.py +0 -0
  10. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_billing.py +0 -0
  11. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_clustered_functions.py +0 -0
  12. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_clustered_functions.pyi +0 -0
  13. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_container_entrypoint.py +0 -0
  14. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_functions.py +0 -0
  15. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_grpc_client.py +0 -0
  16. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_ipython.py +0 -0
  17. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_load_context.py +0 -0
  18. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_location.py +0 -0
  19. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_object.py +0 -0
  20. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_output.py +0 -0
  21. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_partial_function.py +0 -0
  22. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_pty.py +0 -0
  23. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_resolver.py +0 -0
  24. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_resources.py +0 -0
  25. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/__init__.py +0 -0
  26. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/asgi.py +0 -0
  27. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/container_io_manager.py +0 -0
  28. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/container_io_manager.pyi +0 -0
  29. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/execution_context.py +0 -0
  30. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/execution_context.pyi +0 -0
  31. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/telemetry.py +0 -0
  33. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/user_code_event_loop.py +0 -0
  34. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_runtime/user_code_imports.py +0 -0
  35. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_serialization.py +0 -0
  36. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_traceback.py +0 -0
  37. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_tunnel.py +0 -0
  38. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_tunnel.pyi +0 -0
  39. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_type_manager.py +0 -0
  40. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/__init__.py +0 -0
  41. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/app_utils.py +0 -0
  42. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/async_utils.py +0 -0
  43. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/auth_token_manager.py +0 -0
  44. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/bytes_io_segment_payload.py +0 -0
  45. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/deprecation.py +0 -0
  46. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/docker_utils.py +0 -0
  47. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/function_utils.py +0 -0
  48. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/git_utils.py +0 -0
  49. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/grpc_testing.py +0 -0
  50. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/grpc_utils.py +0 -0
  51. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/hash_utils.py +0 -0
  52. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/http_utils.py +0 -0
  53. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/jwt_utils.py +0 -0
  54. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/logger.py +0 -0
  55. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/mount_utils.py +0 -0
  56. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/name_utils.py +0 -0
  57. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/package_utils.py +0 -0
  58. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/pattern_utils.py +0 -0
  59. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/rand_pb_testing.py +0 -0
  60. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/shell_utils.py +0 -0
  61. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/task_command_router_client.py +0 -0
  62. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_utils/time_utils.py +0 -0
  63. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_vendor/__init__.py +0 -0
  64. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  65. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_vendor/cloudpickle.py +0 -0
  66. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_vendor/tblib.py +0 -0
  67. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/_watcher.py +0 -0
  68. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/app.py +0 -0
  69. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/app.pyi +0 -0
  70. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/billing.py +0 -0
  71. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/2023.12.312.txt +0 -0
  72. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/2023.12.txt +0 -0
  73. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/2024.04.txt +0 -0
  74. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/2024.10.txt +0 -0
  75. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/2025.06.txt +0 -0
  76. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/PREVIEW.txt +0 -0
  77. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/README.md +0 -0
  78. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/builder/base-images.json +0 -0
  79. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/call_graph.py +0 -0
  80. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/__init__.py +0 -0
  81. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/_download.py +0 -0
  82. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/_traceback.py +0 -0
  83. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/app.py +0 -0
  84. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/cluster.py +0 -0
  85. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/config.py +0 -0
  86. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/container.py +0 -0
  87. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/dict.py +0 -0
  88. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/entry_point.py +0 -0
  89. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/environment.py +0 -0
  90. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/import_refs.py +0 -0
  91. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/launch.py +0 -0
  92. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/network_file_system.py +0 -0
  93. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/profile.py +0 -0
  94. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/programs/__init__.py +0 -0
  95. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/programs/run_jupyter.py +0 -0
  96. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/programs/vscode.py +0 -0
  97. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/queues.py +0 -0
  98. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/run.py +0 -0
  99. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/secret.py +0 -0
  100. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/shell.py +0 -0
  101. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/token.py +0 -0
  102. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/utils.py +0 -0
  103. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cli/volume.py +0 -0
  104. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/client.py +0 -0
  105. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cloud_bucket_mount.py +0 -0
  106. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cloud_bucket_mount.pyi +0 -0
  107. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cls.py +0 -0
  108. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/cls.pyi +0 -0
  109. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/config.py +0 -0
  110. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/container_process.py +0 -0
  111. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/container_process.pyi +0 -0
  112. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/dict.py +0 -0
  113. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/dict.pyi +0 -0
  114. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/environments.py +0 -0
  115. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/environments.pyi +0 -0
  116. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/exception.py +0 -0
  117. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/experimental/__init__.py +0 -0
  118. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/experimental/flash.py +0 -0
  119. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/experimental/flash.pyi +0 -0
  120. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/experimental/ipython.py +0 -0
  121. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/file_io.py +0 -0
  122. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/file_io.pyi +0 -0
  123. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/file_pattern_matcher.py +0 -0
  124. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/functions.py +0 -0
  125. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/functions.pyi +0 -0
  126. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/gpu.py +0 -0
  127. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/image.py +0 -0
  128. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/image.pyi +0 -0
  129. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/io_streams.py +0 -0
  130. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/io_streams.pyi +0 -0
  131. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/mount.py +0 -0
  132. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/mount.pyi +0 -0
  133. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/network_file_system.py +0 -0
  134. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/network_file_system.pyi +0 -0
  135. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/object.py +0 -0
  136. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/object.pyi +0 -0
  137. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/output.py +0 -0
  138. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/parallel_map.py +0 -0
  139. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/parallel_map.pyi +0 -0
  140. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/partial_function.py +0 -0
  141. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/partial_function.pyi +0 -0
  142. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/proxy.py +0 -0
  143. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/proxy.pyi +0 -0
  144. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/py.typed +0 -0
  145. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/queue.py +0 -0
  146. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/queue.pyi +0 -0
  147. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/retries.py +0 -0
  148. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/runner.py +0 -0
  149. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/runner.pyi +0 -0
  150. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/running_app.py +0 -0
  151. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/sandbox.py +0 -0
  152. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/sandbox.pyi +0 -0
  153. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/schedule.py +0 -0
  154. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/scheduler_placement.py +0 -0
  155. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/secret.py +0 -0
  156. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/secret.pyi +0 -0
  157. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/serving.py +0 -0
  158. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/serving.pyi +0 -0
  159. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/snapshot.py +0 -0
  160. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/snapshot.pyi +0 -0
  161. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/stream_type.py +0 -0
  162. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/token_flow.py +0 -0
  163. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/token_flow.pyi +0 -0
  164. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/volume.py +0 -0
  165. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal/volume.pyi +0 -0
  166. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal.egg-info/SOURCES.txt +0 -0
  167. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal.egg-info/dependency_links.txt +0 -0
  168. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal.egg-info/entry_points.txt +0 -0
  169. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal.egg-info/requires.txt +0 -0
  170. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal.egg-info/top_level.txt +0 -0
  171. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_docs/__init__.py +0 -0
  172. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_docs/gen_cli_docs.py +0 -0
  173. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_docs/gen_reference_docs.py +0 -0
  174. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_docs/mdmd/__init__.py +0 -0
  175. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_docs/mdmd/mdmd.py +0 -0
  176. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_docs/mdmd/signatures.py +0 -0
  177. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/__init__.py +0 -0
  178. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/api.proto +0 -0
  179. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/api_grpc.py +0 -0
  180. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/api_pb2.py +0 -0
  181. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/api_pb2.pyi +0 -0
  182. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/api_pb2_grpc.py +0 -0
  183. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/api_pb2_grpc.pyi +0 -0
  184. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/modal_api_grpc.py +0 -0
  185. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/py.typed +0 -0
  186. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/task_command_router.proto +0 -0
  187. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/task_command_router_grpc.py +0 -0
  188. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/task_command_router_pb2.py +0 -0
  189. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/task_command_router_pb2.pyi +0 -0
  190. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  191. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  192. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/modal_version/__main__.py +0 -0
  193. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/pyproject.toml +0 -0
  194. {modal-1.3.1.dev2 → modal-1.3.1.dev4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.1.dev2
3
+ Version: 1.3.1.dev4
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -4,7 +4,6 @@ import dataclasses
4
4
  import hashlib
5
5
  import os
6
6
  import platform
7
- import random
8
7
  import time
9
8
  from collections.abc import AsyncIterator
10
9
  from contextlib import AbstractContextManager, contextmanager
@@ -58,10 +57,8 @@ MULTIPART_UPLOAD_THRESHOLD = 1024**3
58
57
  # For block based storage like volumefs2: the size of a block
59
58
  BLOCK_SIZE: int = 8 * 1024 * 1024
60
59
 
61
- HEALTHY_R2_UPLOAD_PERCENTAGE = 0.95
62
60
 
63
-
64
- @retry(n_attempts=5, base_delay=0.5, timeout=None)
61
+ @retry(n_attempts=3, base_delay=0.3, timeout=None)
65
62
  async def _upload_to_s3_url(
66
63
  upload_url,
67
64
  payload: "BytesIOSegmentPayload",
@@ -191,13 +188,10 @@ def get_content_length(data: BinaryIO) -> int:
191
188
  async def _blob_upload_with_fallback(
192
189
  items, blob_ids: list[str], callback, content_length: int
193
190
  ) -> tuple[str, bool, int]:
191
+ """Try uploading to each provider in order, with fallback on failure."""
194
192
  r2_throughput_bytes_s = 0
195
193
  r2_failed = False
196
194
  for idx, (item, blob_id) in enumerate(zip(items, blob_ids)):
197
- # We want to default to R2 95% of the time and S3 5% of the time.
198
- # To ensure the failure path is continuously exercised.
199
- if idx == 0 and len(items) > 1 and random.random() > HEALTHY_R2_UPLOAD_PERCENTAGE:
200
- continue
201
195
  try:
202
196
  if blob_id.endswith(":r2"):
203
197
  t0 = time.monotonic_ns()
@@ -207,7 +201,7 @@ async def _blob_upload_with_fallback(
207
201
  else:
208
202
  await callback(item)
209
203
  return blob_id, r2_failed, r2_throughput_bytes_s
210
- except Exception as _:
204
+ except Exception:
211
205
  if blob_id.endswith(":r2"):
212
206
  r2_failed = True
213
207
  # Ignore all errors except the last one, since we're out of fallback options.
@@ -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.dev2",
36
+ version: str = "1.3.1.dev4",
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.dev2",
166
+ version: str = "1.3.1.dev4",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.1.dev2
3
+ Version: 1.3.1.dev4
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.dev2"
4
+ __version__ = "1.3.1.dev4"
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
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes