modAL 1.3.1.dev2__tar.gz → 1.3.1.dev3__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.dev3}/PKG-INFO +1 -1
  2. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/blob_utils.py +3 -9
  3. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/client.pyi +2 -2
  4. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/functions.pyi +6 -6
  5. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_version/__init__.py +1 -1
  7. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/LICENSE +0 -0
  8. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/README.md +0 -0
  9. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/__init__.py +0 -0
  10. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/__main__.py +0 -0
  11. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_billing.py +0 -0
  12. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_clustered_functions.py +0 -0
  13. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_clustered_functions.pyi +0 -0
  14. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_container_entrypoint.py +0 -0
  15. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_functions.py +0 -0
  16. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_grpc_client.py +0 -0
  17. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_ipython.py +0 -0
  18. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_load_context.py +0 -0
  19. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_location.py +0 -0
  20. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_object.py +0 -0
  21. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_output.py +0 -0
  22. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_partial_function.py +0 -0
  23. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_pty.py +0 -0
  24. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_resolver.py +0 -0
  25. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_resources.py +0 -0
  26. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/__init__.py +0 -0
  27. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/asgi.py +0 -0
  28. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/container_io_manager.py +0 -0
  29. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
  30. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/execution_context.py +0 -0
  31. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/execution_context.pyi +0 -0
  32. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  33. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/telemetry.py +0 -0
  34. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/user_code_event_loop.py +0 -0
  35. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_runtime/user_code_imports.py +0 -0
  36. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_serialization.py +0 -0
  37. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_traceback.py +0 -0
  38. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_tunnel.py +0 -0
  39. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_tunnel.pyi +0 -0
  40. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_type_manager.py +0 -0
  41. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/__init__.py +0 -0
  42. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/app_utils.py +0 -0
  43. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/async_utils.py +0 -0
  44. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/auth_token_manager.py +0 -0
  45. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
  46. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/deprecation.py +0 -0
  47. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/docker_utils.py +0 -0
  48. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/function_utils.py +0 -0
  49. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/git_utils.py +0 -0
  50. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/grpc_testing.py +0 -0
  51. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/grpc_utils.py +0 -0
  52. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/hash_utils.py +0 -0
  53. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/http_utils.py +0 -0
  54. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/jwt_utils.py +0 -0
  55. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/logger.py +0 -0
  56. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/mount_utils.py +0 -0
  57. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/name_utils.py +0 -0
  58. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/package_utils.py +0 -0
  59. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/pattern_utils.py +0 -0
  60. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/rand_pb_testing.py +0 -0
  61. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/shell_utils.py +0 -0
  62. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/task_command_router_client.py +0 -0
  63. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_utils/time_utils.py +0 -0
  64. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_vendor/__init__.py +0 -0
  65. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  66. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_vendor/cloudpickle.py +0 -0
  67. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_vendor/tblib.py +0 -0
  68. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/_watcher.py +0 -0
  69. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/app.py +0 -0
  70. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/app.pyi +0 -0
  71. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/billing.py +0 -0
  72. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/2023.12.312.txt +0 -0
  73. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/2023.12.txt +0 -0
  74. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/2024.04.txt +0 -0
  75. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/2024.10.txt +0 -0
  76. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/2025.06.txt +0 -0
  77. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/PREVIEW.txt +0 -0
  78. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/README.md +0 -0
  79. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/builder/base-images.json +0 -0
  80. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/call_graph.py +0 -0
  81. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/__init__.py +0 -0
  82. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/_download.py +0 -0
  83. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/_traceback.py +0 -0
  84. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/app.py +0 -0
  85. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/cluster.py +0 -0
  86. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/config.py +0 -0
  87. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/container.py +0 -0
  88. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/dict.py +0 -0
  89. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/entry_point.py +0 -0
  90. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/environment.py +0 -0
  91. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/import_refs.py +0 -0
  92. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/launch.py +0 -0
  93. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/network_file_system.py +0 -0
  94. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/profile.py +0 -0
  95. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/programs/__init__.py +0 -0
  96. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/programs/run_jupyter.py +0 -0
  97. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/programs/vscode.py +0 -0
  98. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/queues.py +0 -0
  99. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/run.py +0 -0
  100. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/secret.py +0 -0
  101. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/shell.py +0 -0
  102. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/token.py +0 -0
  103. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/utils.py +0 -0
  104. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cli/volume.py +0 -0
  105. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/client.py +0 -0
  106. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cloud_bucket_mount.py +0 -0
  107. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cloud_bucket_mount.pyi +0 -0
  108. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cls.py +0 -0
  109. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/cls.pyi +0 -0
  110. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/config.py +0 -0
  111. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/container_process.py +0 -0
  112. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/container_process.pyi +0 -0
  113. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/dict.py +0 -0
  114. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/dict.pyi +0 -0
  115. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/environments.py +0 -0
  116. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/environments.pyi +0 -0
  117. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/exception.py +0 -0
  118. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/experimental/__init__.py +0 -0
  119. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/experimental/flash.py +0 -0
  120. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/experimental/flash.pyi +0 -0
  121. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/experimental/ipython.py +0 -0
  122. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/file_io.py +0 -0
  123. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/file_io.pyi +0 -0
  124. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/file_pattern_matcher.py +0 -0
  125. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/functions.py +0 -0
  126. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/gpu.py +0 -0
  127. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/image.py +0 -0
  128. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/image.pyi +0 -0
  129. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/io_streams.py +0 -0
  130. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/io_streams.pyi +0 -0
  131. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/mount.py +0 -0
  132. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/mount.pyi +0 -0
  133. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/network_file_system.py +0 -0
  134. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/network_file_system.pyi +0 -0
  135. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/object.py +0 -0
  136. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/object.pyi +0 -0
  137. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/output.py +0 -0
  138. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/parallel_map.py +0 -0
  139. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/parallel_map.pyi +0 -0
  140. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/partial_function.py +0 -0
  141. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/partial_function.pyi +0 -0
  142. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/proxy.py +0 -0
  143. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/proxy.pyi +0 -0
  144. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/py.typed +0 -0
  145. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/queue.py +0 -0
  146. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/queue.pyi +0 -0
  147. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/retries.py +0 -0
  148. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/runner.py +0 -0
  149. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/runner.pyi +0 -0
  150. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/running_app.py +0 -0
  151. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/sandbox.py +0 -0
  152. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/sandbox.pyi +0 -0
  153. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/schedule.py +0 -0
  154. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/scheduler_placement.py +0 -0
  155. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/secret.py +0 -0
  156. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/secret.pyi +0 -0
  157. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/serving.py +0 -0
  158. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/serving.pyi +0 -0
  159. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/snapshot.py +0 -0
  160. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/snapshot.pyi +0 -0
  161. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/stream_type.py +0 -0
  162. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/token_flow.py +0 -0
  163. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/token_flow.pyi +0 -0
  164. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/volume.py +0 -0
  165. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal/volume.pyi +0 -0
  166. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal.egg-info/SOURCES.txt +0 -0
  167. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal.egg-info/dependency_links.txt +0 -0
  168. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal.egg-info/entry_points.txt +0 -0
  169. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal.egg-info/requires.txt +0 -0
  170. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal.egg-info/top_level.txt +0 -0
  171. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_docs/__init__.py +0 -0
  172. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_docs/gen_cli_docs.py +0 -0
  173. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_docs/gen_reference_docs.py +0 -0
  174. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_docs/mdmd/__init__.py +0 -0
  175. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_docs/mdmd/mdmd.py +0 -0
  176. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_docs/mdmd/signatures.py +0 -0
  177. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/__init__.py +0 -0
  178. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/api.proto +0 -0
  179. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/api_grpc.py +0 -0
  180. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/api_pb2.py +0 -0
  181. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/api_pb2.pyi +0 -0
  182. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/api_pb2_grpc.py +0 -0
  183. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
  184. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/modal_api_grpc.py +0 -0
  185. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/py.typed +0 -0
  186. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/task_command_router.proto +0 -0
  187. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/task_command_router_grpc.py +0 -0
  188. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/task_command_router_pb2.py +0 -0
  189. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/task_command_router_pb2.pyi +0 -0
  190. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  191. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  192. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/modal_version/__main__.py +0 -0
  193. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/pyproject.toml +0 -0
  194. {modal-1.3.1.dev2 → modal-1.3.1.dev3}/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.dev3
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.dev3",
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.dev3",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -407,7 +407,7 @@ class Function(
407
407
 
408
408
  _call_generator: ___call_generator_spec
409
409
 
410
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
410
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
411
411
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
412
412
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
413
413
  ...
@@ -416,7 +416,7 @@ class Function(
416
416
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
417
417
  ...
418
418
 
419
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
419
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
420
420
 
421
421
  class __remote_gen_spec(typing_extensions.Protocol):
422
422
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -443,7 +443,7 @@ class Function(
443
443
  """
444
444
  ...
445
445
 
446
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
446
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
447
447
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
448
448
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
449
449
 
@@ -466,7 +466,7 @@ class Function(
466
466
  """
467
467
  ...
468
468
 
469
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
469
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
470
470
 
471
471
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
472
472
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -474,7 +474,7 @@ class Function(
474
474
 
475
475
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
476
476
 
477
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
477
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
478
478
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
479
479
  """Calls the function with the given arguments, without waiting for the results.
480
480
 
@@ -495,7 +495,7 @@ class Function(
495
495
  """
496
496
  ...
497
497
 
498
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
498
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
499
499
 
500
500
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
501
501
  """Return the inner Python object wrapped by this Modal Function."""
@@ -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.dev3
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.dev3"
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