modal 1.1.1.dev5__tar.gz → 1.1.1.dev7__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

Files changed (188) hide show
  1. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/PKG-INFO +1 -1
  2. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/blob_utils.py +16 -21
  3. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/function_utils.py +2 -2
  4. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/client.pyi +2 -2
  5. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/api.proto +2 -1
  7. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/api_pb2.py +503 -503
  8. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/api_pb2.pyi +4 -4
  9. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_version/__init__.py +1 -1
  10. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/LICENSE +0 -0
  11. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/README.md +0 -0
  12. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/__init__.py +0 -0
  13. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/__main__.py +0 -0
  14. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_clustered_functions.py +0 -0
  15. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_clustered_functions.pyi +0 -0
  16. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_container_entrypoint.py +0 -0
  17. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_functions.py +0 -0
  18. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_ipython.py +0 -0
  19. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_location.py +0 -0
  20. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_object.py +0 -0
  21. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_output.py +0 -0
  22. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_partial_function.py +0 -0
  23. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_pty.py +0 -0
  24. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_resolver.py +0 -0
  25. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_resources.py +0 -0
  26. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/__init__.py +0 -0
  27. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/asgi.py +0 -0
  28. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/container_io_manager.py +0 -0
  29. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/container_io_manager.pyi +0 -0
  30. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/execution_context.py +0 -0
  31. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/execution_context.pyi +0 -0
  32. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  33. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/telemetry.py +0 -0
  34. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_runtime/user_code_imports.py +0 -0
  35. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_serialization.py +0 -0
  36. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_traceback.py +0 -0
  37. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_tunnel.py +0 -0
  38. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_tunnel.pyi +0 -0
  39. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_type_manager.py +0 -0
  40. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/__init__.py +0 -0
  41. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/app_utils.py +0 -0
  42. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/async_utils.py +0 -0
  43. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/auth_token_manager.py +0 -0
  44. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/bytes_io_segment_payload.py +0 -0
  45. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/deprecation.py +0 -0
  46. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/docker_utils.py +0 -0
  47. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/logger.py +0 -0
  54. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_utils/time_utils.py +0 -0
  61. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_vendor/__init__.py +0 -0
  62. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  63. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_vendor/cloudpickle.py +0 -0
  64. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_vendor/tblib.py +0 -0
  65. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/_watcher.py +0 -0
  66. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/app.py +0 -0
  67. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/app.pyi +0 -0
  68. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/call_graph.py +0 -0
  69. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/__init__.py +0 -0
  70. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/_download.py +0 -0
  71. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/_traceback.py +0 -0
  72. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/app.py +0 -0
  73. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/cluster.py +0 -0
  74. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/config.py +0 -0
  75. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/container.py +0 -0
  76. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/dict.py +0 -0
  77. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/entry_point.py +0 -0
  78. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/environment.py +0 -0
  79. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/import_refs.py +0 -0
  80. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/launch.py +0 -0
  81. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/network_file_system.py +0 -0
  82. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/profile.py +0 -0
  83. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/programs/__init__.py +0 -0
  84. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/programs/run_jupyter.py +0 -0
  85. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/programs/vscode.py +0 -0
  86. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/queues.py +0 -0
  87. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/run.py +0 -0
  88. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/secret.py +0 -0
  89. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/token.py +0 -0
  90. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/utils.py +0 -0
  91. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cli/volume.py +0 -0
  92. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/client.py +0 -0
  93. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cloud_bucket_mount.py +0 -0
  94. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cloud_bucket_mount.pyi +0 -0
  95. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cls.py +0 -0
  96. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/cls.pyi +0 -0
  97. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/config.py +0 -0
  98. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/container_process.py +0 -0
  99. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/container_process.pyi +0 -0
  100. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/dict.py +0 -0
  101. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/dict.pyi +0 -0
  102. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/environments.py +0 -0
  103. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/environments.pyi +0 -0
  104. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/exception.py +0 -0
  105. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/experimental/__init__.py +0 -0
  106. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/experimental/flash.py +0 -0
  107. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/experimental/flash.pyi +0 -0
  108. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/experimental/ipython.py +0 -0
  109. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/file_io.py +0 -0
  110. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/file_io.pyi +0 -0
  111. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/file_pattern_matcher.py +0 -0
  112. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/functions.py +0 -0
  113. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/functions.pyi +0 -0
  114. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/gpu.py +0 -0
  115. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/image.py +0 -0
  116. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/image.pyi +0 -0
  117. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/io_streams.py +0 -0
  118. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/io_streams.pyi +0 -0
  119. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/mount.py +0 -0
  120. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/mount.pyi +0 -0
  121. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/network_file_system.py +0 -0
  122. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/network_file_system.pyi +0 -0
  123. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/object.py +0 -0
  124. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/object.pyi +0 -0
  125. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/output.py +0 -0
  126. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/parallel_map.py +0 -0
  127. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/parallel_map.pyi +0 -0
  128. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/partial_function.py +0 -0
  129. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/partial_function.pyi +0 -0
  130. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/proxy.py +0 -0
  131. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/proxy.pyi +0 -0
  132. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/py.typed +0 -0
  133. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/queue.py +0 -0
  134. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/queue.pyi +0 -0
  135. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/2023.12.312.txt +0 -0
  136. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/2023.12.txt +0 -0
  137. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/2024.04.txt +0 -0
  138. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/2024.10.txt +0 -0
  139. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/2025.06.txt +0 -0
  140. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/PREVIEW.txt +0 -0
  141. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/README.md +0 -0
  142. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/requirements/base-images.json +0 -0
  143. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/retries.py +0 -0
  144. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/runner.py +0 -0
  145. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/runner.pyi +0 -0
  146. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/running_app.py +0 -0
  147. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/sandbox.py +0 -0
  148. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/sandbox.pyi +0 -0
  149. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/schedule.py +0 -0
  150. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/scheduler_placement.py +0 -0
  151. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/secret.py +0 -0
  152. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/secret.pyi +0 -0
  153. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/serving.py +0 -0
  154. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/serving.pyi +0 -0
  155. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/snapshot.py +0 -0
  156. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/snapshot.pyi +0 -0
  157. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/stream_type.py +0 -0
  158. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/token_flow.py +0 -0
  159. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/token_flow.pyi +0 -0
  160. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/volume.py +0 -0
  161. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal/volume.pyi +0 -0
  162. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal.egg-info/SOURCES.txt +0 -0
  163. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal.egg-info/dependency_links.txt +0 -0
  164. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal.egg-info/entry_points.txt +0 -0
  165. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal.egg-info/requires.txt +0 -0
  166. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal.egg-info/top_level.txt +0 -0
  167. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_docs/__init__.py +0 -0
  168. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_docs/gen_cli_docs.py +0 -0
  169. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_docs/gen_reference_docs.py +0 -0
  170. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_docs/mdmd/__init__.py +0 -0
  171. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_docs/mdmd/mdmd.py +0 -0
  172. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_docs/mdmd/signatures.py +0 -0
  173. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/__init__.py +0 -0
  174. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/api_grpc.py +0 -0
  175. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/api_pb2_grpc.py +0 -0
  176. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/api_pb2_grpc.pyi +0 -0
  177. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/modal_api_grpc.py +0 -0
  178. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/modal_options_grpc.py +0 -0
  179. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/options.proto +0 -0
  180. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/options_grpc.py +0 -0
  181. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/options_pb2.py +0 -0
  182. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/options_pb2.pyi +0 -0
  183. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/options_pb2_grpc.py +0 -0
  184. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/options_pb2_grpc.pyi +0 -0
  185. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_proto/py.typed +0 -0
  186. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/modal_version/__main__.py +0 -0
  187. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/pyproject.toml +0 -0
  188. {modal-1.1.1.dev5 → modal-1.1.1.dev7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.1.dev5
3
+ Version: 1.1.1.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -188,16 +188,10 @@ def get_content_length(data: BinaryIO) -> int:
188
188
  return content_length - pos
189
189
 
190
190
 
191
- async def _measure_endpoint_latency(item: str) -> int:
192
- latency_ms = 0
193
- t0 = time.monotonic_ns()
194
- async with ClientSessionRegistry.get_session().head(item) as _:
195
- latency_ms = (time.monotonic_ns() - t0) // 1_000_000
196
- return latency_ms
197
-
198
-
199
- async def _blob_upload_with_fallback(items, blob_ids: list[str], callback) -> tuple[str, bool, int]:
200
- r2_latency_ms = 0
191
+ async def _blob_upload_with_fallback(
192
+ items, blob_ids: list[str], callback, content_length: int
193
+ ) -> tuple[str, bool, int]:
194
+ r2_throughput_bytes_s = 0
201
195
  r2_failed = False
202
196
  for idx, (item, blob_id) in enumerate(zip(items, blob_ids)):
203
197
  # We want to default to R2 95% of the time and S3 5% of the time.
@@ -206,14 +200,13 @@ async def _blob_upload_with_fallback(items, blob_ids: list[str], callback) -> tu
206
200
  continue
207
201
  try:
208
202
  if blob_id.endswith(":r2"):
209
- # measure the time it takes to contact the bucket endpoint
210
- r2_latency_ms, _ = await asyncio.gather(
211
- _measure_endpoint_latency(item),
212
- callback(item),
213
- )
203
+ t0 = time.monotonic_ns()
204
+ await callback(item)
205
+ dt_ns = time.monotonic_ns() - t0
206
+ r2_throughput_bytes_s = (content_length * 1_000_000_000) // max(dt_ns, 1)
214
207
  else:
215
208
  await callback(item)
216
- return blob_id, r2_failed, r2_latency_ms
209
+ return blob_id, r2_failed, r2_throughput_bytes_s
217
210
  except Exception as _:
218
211
  if blob_id.endswith(":r2"):
219
212
  r2_failed = True
@@ -251,10 +244,11 @@ async def _blob_upload(
251
244
  progress_report_cb=progress_report_cb,
252
245
  )
253
246
 
254
- blob_id, r2_failed, r2_latency_ms = await _blob_upload_with_fallback(
247
+ blob_id, r2_failed, r2_throughput_bytes_s = await _blob_upload_with_fallback(
255
248
  resp.multiparts.items,
256
249
  resp.blob_ids,
257
250
  upload_multipart_upload,
251
+ content_length=content_length,
258
252
  )
259
253
  else:
260
254
  from .bytes_io_segment_payload import BytesIOSegmentPayload
@@ -271,16 +265,17 @@ async def _blob_upload(
271
265
  content_md5_b64=upload_hashes.md5_base64,
272
266
  )
273
267
 
274
- blob_id, r2_failed, r2_latency_ms = await _blob_upload_with_fallback(
268
+ blob_id, r2_failed, r2_throughput_bytes_s = await _blob_upload_with_fallback(
275
269
  resp.upload_urls.items,
276
270
  resp.blob_ids,
277
271
  upload_to_s3_url,
272
+ content_length=content_length,
278
273
  )
279
274
 
280
275
  if progress_report_cb:
281
276
  progress_report_cb(complete=True)
282
277
 
283
- return blob_id, r2_failed, r2_latency_ms
278
+ return blob_id, r2_failed, r2_throughput_bytes_s
284
279
 
285
280
 
286
281
  async def blob_upload_with_r2_failure_info(payload: bytes, stub: ModalClientModal) -> tuple[str, bool, int]:
@@ -291,13 +286,13 @@ async def blob_upload_with_r2_failure_info(payload: bytes, stub: ModalClientModa
291
286
  logger.warning("Blob uploading string, not bytes - auto-encoding as utf8")
292
287
  payload = payload.encode("utf8")
293
288
  upload_hashes = get_upload_hashes(payload)
294
- blob_id, r2_failed, r2_latency_ms = await _blob_upload(upload_hashes, payload, stub)
289
+ blob_id, r2_failed, r2_throughput_bytes_s = await _blob_upload(upload_hashes, payload, stub)
295
290
  dur_s = max(time.time() - t0, 0.001) # avoid division by zero
296
291
  throughput_mib_s = (size_mib) / dur_s
297
292
  logger.debug(
298
293
  f"Uploaded large blob of size {size_mib:.2f} MiB ({throughput_mib_s:.2f} MiB/s, total {dur_s:.2f}s). {blob_id}"
299
294
  )
300
- return blob_id, r2_failed, r2_latency_ms
295
+ return blob_id, r2_failed, r2_throughput_bytes_s
301
296
 
302
297
 
303
298
  async def blob_upload(payload: bytes, stub: ModalClientModal) -> str:
@@ -563,7 +563,7 @@ async def _create_input(
563
563
  args_serialized = serialize((args, kwargs))
564
564
 
565
565
  if should_upload(len(args_serialized), max_object_size_bytes, function_call_invocation_type):
566
- args_blob_id, r2_failed, r2_latency_ms = await blob_upload_with_r2_failure_info(args_serialized, stub)
566
+ args_blob_id, r2_failed, r2_throughput_bytes_s = await blob_upload_with_r2_failure_info(args_serialized, stub)
567
567
  return api_pb2.FunctionPutInputsItem(
568
568
  input=api_pb2.FunctionInput(
569
569
  args_blob_id=args_blob_id,
@@ -572,7 +572,7 @@ async def _create_input(
572
572
  ),
573
573
  idx=idx,
574
574
  r2_failed=r2_failed,
575
- r2_latency_ms=r2_latency_ms,
575
+ r2_throughput_bytes_s=r2_throughput_bytes_s,
576
576
  )
577
577
  else:
578
578
  return api_pb2.FunctionPutInputsItem(
@@ -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.1.1.dev5",
36
+ version: str = "1.1.1.dev7",
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.1.1.dev5",
166
+ version: str = "1.1.1.dev7",
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.1.1.dev5
3
+ Version: 1.1.1.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1816,7 +1816,8 @@ message FunctionPutInputsItem {
1816
1816
  int32 idx = 1;
1817
1817
  FunctionInput input = 2;
1818
1818
  bool r2_failed = 3;
1819
- uint64 r2_latency_ms = 4;
1819
+ reserved 4; // r2_latency_ms
1820
+ uint64 r2_throughput_bytes_s = 5;
1820
1821
  }
1821
1822
 
1822
1823
  message FunctionPutInputsRequest {