modal 1.0.2.dev2__tar.gz → 1.0.2.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 (184) hide show
  1. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/PKG-INFO +1 -1
  2. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/bytes_io_segment_payload.py +6 -2
  3. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/client.pyi +2 -2
  4. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/exception.py +2 -0
  5. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/functions.pyi +6 -6
  6. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/volume.py +13 -8
  7. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/volume.pyi +2 -2
  8. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_version/__init__.py +1 -1
  10. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/LICENSE +0 -0
  11. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/README.md +0 -0
  12. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/__init__.py +0 -0
  13. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/__main__.py +0 -0
  14. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_clustered_functions.py +0 -0
  15. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_clustered_functions.pyi +0 -0
  16. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_container_entrypoint.py +0 -0
  17. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_functions.py +0 -0
  18. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_ipython.py +0 -0
  19. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_location.py +0 -0
  20. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_object.py +0 -0
  21. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_output.py +0 -0
  22. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_partial_function.py +0 -0
  23. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_pty.py +0 -0
  24. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_resolver.py +0 -0
  25. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_resources.py +0 -0
  26. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/__init__.py +0 -0
  27. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/asgi.py +0 -0
  28. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/container_io_manager.py +0 -0
  29. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/container_io_manager.pyi +0 -0
  30. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/execution_context.py +0 -0
  31. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/execution_context.pyi +0 -0
  32. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  33. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/telemetry.py +0 -0
  34. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_runtime/user_code_imports.py +0 -0
  35. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_serialization.py +0 -0
  36. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_traceback.py +0 -0
  37. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_tunnel.py +0 -0
  38. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_tunnel.pyi +0 -0
  39. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_type_manager.py +0 -0
  40. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/__init__.py +0 -0
  41. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/app_utils.py +0 -0
  42. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/async_utils.py +0 -0
  43. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/blob_utils.py +0 -0
  44. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/deprecation.py +0 -0
  45. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/docker_utils.py +0 -0
  46. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/function_utils.py +0 -0
  47. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/logger.py +0 -0
  54. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_utils/time_utils.py +0 -0
  61. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_vendor/__init__.py +0 -0
  62. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  63. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_vendor/cloudpickle.py +0 -0
  64. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_vendor/tblib.py +0 -0
  65. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/_watcher.py +0 -0
  66. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/app.py +0 -0
  67. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/app.pyi +0 -0
  68. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/call_graph.py +0 -0
  69. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/__init__.py +0 -0
  70. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/_download.py +0 -0
  71. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/_traceback.py +0 -0
  72. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/app.py +0 -0
  73. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/cluster.py +0 -0
  74. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/config.py +0 -0
  75. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/container.py +0 -0
  76. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/dict.py +0 -0
  77. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/entry_point.py +0 -0
  78. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/environment.py +0 -0
  79. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/import_refs.py +0 -0
  80. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/launch.py +0 -0
  81. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/network_file_system.py +0 -0
  82. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/profile.py +0 -0
  83. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/programs/__init__.py +0 -0
  84. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/programs/run_jupyter.py +0 -0
  85. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/programs/vscode.py +0 -0
  86. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/queues.py +0 -0
  87. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/run.py +0 -0
  88. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/secret.py +0 -0
  89. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/token.py +0 -0
  90. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/utils.py +0 -0
  91. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cli/volume.py +0 -0
  92. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/client.py +0 -0
  93. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cloud_bucket_mount.py +0 -0
  94. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cloud_bucket_mount.pyi +0 -0
  95. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cls.py +0 -0
  96. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/cls.pyi +0 -0
  97. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/config.py +0 -0
  98. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/container_process.py +0 -0
  99. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/container_process.pyi +0 -0
  100. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/dict.py +0 -0
  101. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/dict.pyi +0 -0
  102. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/environments.py +0 -0
  103. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/environments.pyi +0 -0
  104. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/experimental/__init__.py +0 -0
  105. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/experimental/ipython.py +0 -0
  106. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/file_io.py +0 -0
  107. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/file_io.pyi +0 -0
  108. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/file_pattern_matcher.py +0 -0
  109. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/functions.py +0 -0
  110. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/gpu.py +0 -0
  111. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/image.py +0 -0
  112. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/image.pyi +0 -0
  113. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/io_streams.py +0 -0
  114. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/io_streams.pyi +0 -0
  115. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/mount.py +0 -0
  116. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/mount.pyi +0 -0
  117. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/network_file_system.py +0 -0
  118. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/network_file_system.pyi +0 -0
  119. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/object.py +0 -0
  120. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/object.pyi +0 -0
  121. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/output.py +0 -0
  122. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/parallel_map.py +0 -0
  123. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/parallel_map.pyi +0 -0
  124. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/partial_function.py +0 -0
  125. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/partial_function.pyi +0 -0
  126. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/proxy.py +0 -0
  127. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/proxy.pyi +0 -0
  128. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/py.typed +0 -0
  129. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/queue.py +0 -0
  130. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/queue.pyi +0 -0
  131. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/requirements/2023.12.312.txt +0 -0
  132. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/requirements/2023.12.txt +0 -0
  133. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/requirements/2024.04.txt +0 -0
  134. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/requirements/2024.10.txt +0 -0
  135. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/requirements/PREVIEW.txt +0 -0
  136. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/requirements/README.md +0 -0
  137. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/requirements/base-images.json +0 -0
  138. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/retries.py +0 -0
  139. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/runner.py +0 -0
  140. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/runner.pyi +0 -0
  141. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/running_app.py +0 -0
  142. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/sandbox.py +0 -0
  143. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/sandbox.pyi +0 -0
  144. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/schedule.py +0 -0
  145. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/scheduler_placement.py +0 -0
  146. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/secret.py +0 -0
  147. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/secret.pyi +0 -0
  148. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/serving.py +0 -0
  149. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/serving.pyi +0 -0
  150. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/snapshot.py +0 -0
  151. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/snapshot.pyi +0 -0
  152. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/stream_type.py +0 -0
  153. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/token_flow.py +0 -0
  154. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal/token_flow.pyi +0 -0
  155. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal.egg-info/SOURCES.txt +0 -0
  156. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal.egg-info/dependency_links.txt +0 -0
  157. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal.egg-info/entry_points.txt +0 -0
  158. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal.egg-info/requires.txt +0 -0
  159. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal.egg-info/top_level.txt +0 -0
  160. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_docs/__init__.py +0 -0
  161. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_docs/gen_cli_docs.py +0 -0
  162. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_docs/gen_reference_docs.py +0 -0
  163. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_docs/mdmd/__init__.py +0 -0
  164. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_docs/mdmd/mdmd.py +0 -0
  165. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_docs/mdmd/signatures.py +0 -0
  166. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/__init__.py +0 -0
  167. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/api.proto +0 -0
  168. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/api_grpc.py +0 -0
  169. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/api_pb2.py +0 -0
  170. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/api_pb2.pyi +0 -0
  171. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/options.proto +0 -0
  176. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/options_grpc.py +0 -0
  177. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/options_pb2.py +0 -0
  178. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_proto/py.typed +0 -0
  182. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/modal_version/__main__.py +0 -0
  183. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/pyproject.toml +0 -0
  184. {modal-1.0.2.dev2 → modal-1.0.2.dev4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.2.dev2
3
+ Version: 1.0.2.dev4
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -52,12 +52,16 @@ class BytesIOSegmentPayload(BytesIOPayload):
52
52
  self._value.seek(self.initial_seek_pos)
53
53
 
54
54
  @contextmanager
55
- def reset_on_error(self):
55
+ def reset_on_error(self, subtract_progress: bool = False):
56
56
  try:
57
57
  yield
58
58
  except Exception as exc:
59
59
  try:
60
- self.progress_report_cb(reset=True)
60
+ if subtract_progress:
61
+ negative_progress = -self.num_bytes_read
62
+ self.progress_report_cb(advance=negative_progress)
63
+ else:
64
+ self.progress_report_cb(reset=True)
61
65
  except Exception as cb_exc:
62
66
  raise cb_exc from exc
63
67
  raise exc
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "1.0.2.dev2",
34
+ version: str = "1.0.2.dev4",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -94,7 +94,7 @@ class Client:
94
94
  server_url: str,
95
95
  client_type: int,
96
96
  credentials: typing.Optional[tuple[str, str]],
97
- version: str = "1.0.2.dev2",
97
+ version: str = "1.0.2.dev4",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -161,6 +161,8 @@ def simulate_preemption(wait_seconds: int, jitter_seconds: int = 0):
161
161
  See https://modal.com/docs/guide/preemption for more details on preemption
162
162
  handling.
163
163
  """
164
+ if wait_seconds <= 0:
165
+ raise ValueError("Time to wait must be greater than 0")
164
166
  signal.signal(signal.SIGALRM, _simulate_preemption_interrupt)
165
167
  jitter = random.randrange(0, jitter_seconds) if jitter_seconds else 0
166
168
  signal.alarm(wait_seconds + jitter)
@@ -227,11 +227,11 @@ class Function(
227
227
 
228
228
  _call_generator: ___call_generator_spec[typing_extensions.Self]
229
229
 
230
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
230
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
231
231
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
232
232
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
233
233
 
234
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
234
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
235
235
 
236
236
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
237
237
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -246,12 +246,12 @@ class Function(
246
246
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
247
247
  ) -> modal._functions.OriginalReturnType: ...
248
248
 
249
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
249
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
250
250
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
251
251
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
252
252
 
253
253
  _experimental_spawn: ___experimental_spawn_spec[
254
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
254
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
255
255
  ]
256
256
 
257
257
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -260,11 +260,11 @@ class Function(
260
260
 
261
261
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
262
262
 
263
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
263
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
264
264
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
265
265
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
266
266
 
267
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
267
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
268
268
 
269
269
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
270
270
 
@@ -38,6 +38,7 @@ from ._utils.async_utils import (
38
38
  async_map,
39
39
  async_map_ordered,
40
40
  asyncnullcontext,
41
+ retry,
41
42
  synchronize_api,
42
43
  )
43
44
  from ._utils.blob_utils import (
@@ -835,7 +836,7 @@ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
835
836
  progress_cb: Optional[Callable[..., Any]] = None,
836
837
  force: bool = False,
837
838
  hash_concurrency: int = multiprocessing.cpu_count(),
838
- put_concurrency: int = multiprocessing.cpu_count(),
839
+ put_concurrency: int = 128,
839
840
  ):
840
841
  """mdmd:hidden"""
841
842
  self._volume_id = volume_id
@@ -1020,6 +1021,16 @@ async def _put_missing_blocks(
1020
1021
  file_progress.pending_blocks.add(missing_block.block_index)
1021
1022
  task_progress_cb = functools.partial(progress_cb, task_id=file_progress.task_id)
1022
1023
 
1024
+ @retry(n_attempts=5, base_delay=0.5, timeout=None)
1025
+ async def put_missing_block_attempt(payload: BytesIOSegmentPayload) -> bytes:
1026
+ with payload.reset_on_error(subtract_progress=True):
1027
+ async with ClientSessionRegistry.get_session().put(
1028
+ missing_block.put_url,
1029
+ data=payload,
1030
+ ) as response:
1031
+ response.raise_for_status()
1032
+ return await response.content.read()
1033
+
1023
1034
  async with put_semaphore:
1024
1035
  with file_spec.source() as source_fp:
1025
1036
  payload = BytesIOSegmentPayload(
@@ -1030,13 +1041,7 @@ async def _put_missing_blocks(
1030
1041
  chunk_size=256 * 1024,
1031
1042
  progress_report_cb=task_progress_cb,
1032
1043
  )
1033
-
1034
- async with ClientSessionRegistry.get_session().put(
1035
- missing_block.put_url,
1036
- data=payload,
1037
- ) as response:
1038
- response.raise_for_status()
1039
- resp_data = await response.content.read()
1044
+ resp_data = await put_missing_block_attempt(payload)
1040
1045
 
1041
1046
  file_progress.pending_blocks.remove(missing_block.block_index)
1042
1047
 
@@ -494,7 +494,7 @@ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
494
494
  progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
495
495
  force: bool = False,
496
496
  hash_concurrency: int = 4,
497
- put_concurrency: int = 4,
497
+ put_concurrency: int = 128,
498
498
  ): ...
499
499
  async def __aenter__(self): ...
500
500
  async def __aexit__(self, exc_type, exc_val, exc_tb): ...
@@ -534,7 +534,7 @@ class VolumeUploadContextManager2(AbstractVolumeUploadContextManager):
534
534
  progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
535
535
  force: bool = False,
536
536
  hash_concurrency: int = 4,
537
- put_concurrency: int = 4,
537
+ put_concurrency: int = 128,
538
538
  ): ...
539
539
  def __enter__(self): ...
540
540
  async def __aenter__(self): ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.2.dev2
3
+ Version: 1.0.2.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.0.2.dev2"
4
+ __version__ = "1.0.2.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