modal 0.74.4__tar.gz → 0.74.6__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 (183) hide show
  1. {modal-0.74.4 → modal-0.74.6}/PKG-INFO +1 -1
  2. {modal-0.74.4 → modal-0.74.6}/modal/_container_entrypoint.py +12 -2
  3. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/container_io_manager.py +4 -26
  4. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/container_io_manager.pyi +0 -17
  5. {modal-0.74.4 → modal-0.74.6}/modal/client.pyi +2 -2
  6. {modal-0.74.4 → modal-0.74.6}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-0.74.4 → modal-0.74.6}/modal_proto/api.proto +3 -0
  8. {modal-0.74.4 → modal-0.74.6}/modal_proto/api_pb2.py +87 -87
  9. {modal-0.74.4 → modal-0.74.6}/modal_proto/api_pb2.pyi +7 -1
  10. {modal-0.74.4 → modal-0.74.6}/modal_version/_version_generated.py +1 -1
  11. {modal-0.74.4 → modal-0.74.6}/LICENSE +0 -0
  12. {modal-0.74.4 → modal-0.74.6}/README.md +0 -0
  13. {modal-0.74.4 → modal-0.74.6}/modal/__init__.py +0 -0
  14. {modal-0.74.4 → modal-0.74.6}/modal/__main__.py +0 -0
  15. {modal-0.74.4 → modal-0.74.6}/modal/_clustered_functions.py +0 -0
  16. {modal-0.74.4 → modal-0.74.6}/modal/_clustered_functions.pyi +0 -0
  17. {modal-0.74.4 → modal-0.74.6}/modal/_functions.py +0 -0
  18. {modal-0.74.4 → modal-0.74.6}/modal/_ipython.py +0 -0
  19. {modal-0.74.4 → modal-0.74.6}/modal/_location.py +0 -0
  20. {modal-0.74.4 → modal-0.74.6}/modal/_object.py +0 -0
  21. {modal-0.74.4 → modal-0.74.6}/modal/_output.py +0 -0
  22. {modal-0.74.4 → modal-0.74.6}/modal/_partial_function.py +0 -0
  23. {modal-0.74.4 → modal-0.74.6}/modal/_pty.py +0 -0
  24. {modal-0.74.4 → modal-0.74.6}/modal/_resolver.py +0 -0
  25. {modal-0.74.4 → modal-0.74.6}/modal/_resources.py +0 -0
  26. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/__init__.py +0 -0
  27. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/asgi.py +0 -0
  28. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/execution_context.py +0 -0
  29. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/execution_context.pyi +0 -0
  30. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  31. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/telemetry.py +0 -0
  32. {modal-0.74.4 → modal-0.74.6}/modal/_runtime/user_code_imports.py +0 -0
  33. {modal-0.74.4 → modal-0.74.6}/modal/_serialization.py +0 -0
  34. {modal-0.74.4 → modal-0.74.6}/modal/_traceback.py +0 -0
  35. {modal-0.74.4 → modal-0.74.6}/modal/_tunnel.py +0 -0
  36. {modal-0.74.4 → modal-0.74.6}/modal/_tunnel.pyi +0 -0
  37. {modal-0.74.4 → modal-0.74.6}/modal/_type_manager.py +0 -0
  38. {modal-0.74.4 → modal-0.74.6}/modal/_utils/__init__.py +0 -0
  39. {modal-0.74.4 → modal-0.74.6}/modal/_utils/app_utils.py +0 -0
  40. {modal-0.74.4 → modal-0.74.6}/modal/_utils/async_utils.py +0 -0
  41. {modal-0.74.4 → modal-0.74.6}/modal/_utils/blob_utils.py +0 -0
  42. {modal-0.74.4 → modal-0.74.6}/modal/_utils/bytes_io_segment_payload.py +0 -0
  43. {modal-0.74.4 → modal-0.74.6}/modal/_utils/deprecation.py +0 -0
  44. {modal-0.74.4 → modal-0.74.6}/modal/_utils/docker_utils.py +0 -0
  45. {modal-0.74.4 → modal-0.74.6}/modal/_utils/function_utils.py +0 -0
  46. {modal-0.74.4 → modal-0.74.6}/modal/_utils/git_utils.py +0 -0
  47. {modal-0.74.4 → modal-0.74.6}/modal/_utils/grpc_testing.py +0 -0
  48. {modal-0.74.4 → modal-0.74.6}/modal/_utils/grpc_utils.py +0 -0
  49. {modal-0.74.4 → modal-0.74.6}/modal/_utils/hash_utils.py +0 -0
  50. {modal-0.74.4 → modal-0.74.6}/modal/_utils/http_utils.py +0 -0
  51. {modal-0.74.4 → modal-0.74.6}/modal/_utils/jwt_utils.py +0 -0
  52. {modal-0.74.4 → modal-0.74.6}/modal/_utils/logger.py +0 -0
  53. {modal-0.74.4 → modal-0.74.6}/modal/_utils/mount_utils.py +0 -0
  54. {modal-0.74.4 → modal-0.74.6}/modal/_utils/name_utils.py +0 -0
  55. {modal-0.74.4 → modal-0.74.6}/modal/_utils/package_utils.py +0 -0
  56. {modal-0.74.4 → modal-0.74.6}/modal/_utils/pattern_utils.py +0 -0
  57. {modal-0.74.4 → modal-0.74.6}/modal/_utils/rand_pb_testing.py +0 -0
  58. {modal-0.74.4 → modal-0.74.6}/modal/_utils/shell_utils.py +0 -0
  59. {modal-0.74.4 → modal-0.74.6}/modal/_vendor/__init__.py +0 -0
  60. {modal-0.74.4 → modal-0.74.6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  61. {modal-0.74.4 → modal-0.74.6}/modal/_vendor/cloudpickle.py +0 -0
  62. {modal-0.74.4 → modal-0.74.6}/modal/_vendor/tblib.py +0 -0
  63. {modal-0.74.4 → modal-0.74.6}/modal/_watcher.py +0 -0
  64. {modal-0.74.4 → modal-0.74.6}/modal/app.py +0 -0
  65. {modal-0.74.4 → modal-0.74.6}/modal/app.pyi +0 -0
  66. {modal-0.74.4 → modal-0.74.6}/modal/call_graph.py +0 -0
  67. {modal-0.74.4 → modal-0.74.6}/modal/cli/__init__.py +0 -0
  68. {modal-0.74.4 → modal-0.74.6}/modal/cli/_download.py +0 -0
  69. {modal-0.74.4 → modal-0.74.6}/modal/cli/_traceback.py +0 -0
  70. {modal-0.74.4 → modal-0.74.6}/modal/cli/app.py +0 -0
  71. {modal-0.74.4 → modal-0.74.6}/modal/cli/config.py +0 -0
  72. {modal-0.74.4 → modal-0.74.6}/modal/cli/container.py +0 -0
  73. {modal-0.74.4 → modal-0.74.6}/modal/cli/dict.py +0 -0
  74. {modal-0.74.4 → modal-0.74.6}/modal/cli/entry_point.py +0 -0
  75. {modal-0.74.4 → modal-0.74.6}/modal/cli/environment.py +0 -0
  76. {modal-0.74.4 → modal-0.74.6}/modal/cli/import_refs.py +0 -0
  77. {modal-0.74.4 → modal-0.74.6}/modal/cli/launch.py +0 -0
  78. {modal-0.74.4 → modal-0.74.6}/modal/cli/network_file_system.py +0 -0
  79. {modal-0.74.4 → modal-0.74.6}/modal/cli/profile.py +0 -0
  80. {modal-0.74.4 → modal-0.74.6}/modal/cli/programs/__init__.py +0 -0
  81. {modal-0.74.4 → modal-0.74.6}/modal/cli/programs/run_jupyter.py +0 -0
  82. {modal-0.74.4 → modal-0.74.6}/modal/cli/programs/vscode.py +0 -0
  83. {modal-0.74.4 → modal-0.74.6}/modal/cli/queues.py +0 -0
  84. {modal-0.74.4 → modal-0.74.6}/modal/cli/run.py +0 -0
  85. {modal-0.74.4 → modal-0.74.6}/modal/cli/secret.py +0 -0
  86. {modal-0.74.4 → modal-0.74.6}/modal/cli/token.py +0 -0
  87. {modal-0.74.4 → modal-0.74.6}/modal/cli/utils.py +0 -0
  88. {modal-0.74.4 → modal-0.74.6}/modal/cli/volume.py +0 -0
  89. {modal-0.74.4 → modal-0.74.6}/modal/client.py +0 -0
  90. {modal-0.74.4 → modal-0.74.6}/modal/cloud_bucket_mount.py +0 -0
  91. {modal-0.74.4 → modal-0.74.6}/modal/cloud_bucket_mount.pyi +0 -0
  92. {modal-0.74.4 → modal-0.74.6}/modal/cls.py +0 -0
  93. {modal-0.74.4 → modal-0.74.6}/modal/cls.pyi +0 -0
  94. {modal-0.74.4 → modal-0.74.6}/modal/config.py +0 -0
  95. {modal-0.74.4 → modal-0.74.6}/modal/container_process.py +0 -0
  96. {modal-0.74.4 → modal-0.74.6}/modal/container_process.pyi +0 -0
  97. {modal-0.74.4 → modal-0.74.6}/modal/dict.py +0 -0
  98. {modal-0.74.4 → modal-0.74.6}/modal/dict.pyi +0 -0
  99. {modal-0.74.4 → modal-0.74.6}/modal/environments.py +0 -0
  100. {modal-0.74.4 → modal-0.74.6}/modal/environments.pyi +0 -0
  101. {modal-0.74.4 → modal-0.74.6}/modal/exception.py +0 -0
  102. {modal-0.74.4 → modal-0.74.6}/modal/experimental/__init__.py +0 -0
  103. {modal-0.74.4 → modal-0.74.6}/modal/experimental/ipython.py +0 -0
  104. {modal-0.74.4 → modal-0.74.6}/modal/file_io.py +0 -0
  105. {modal-0.74.4 → modal-0.74.6}/modal/file_io.pyi +0 -0
  106. {modal-0.74.4 → modal-0.74.6}/modal/file_pattern_matcher.py +0 -0
  107. {modal-0.74.4 → modal-0.74.6}/modal/functions.py +0 -0
  108. {modal-0.74.4 → modal-0.74.6}/modal/functions.pyi +0 -0
  109. {modal-0.74.4 → modal-0.74.6}/modal/gpu.py +0 -0
  110. {modal-0.74.4 → modal-0.74.6}/modal/image.py +0 -0
  111. {modal-0.74.4 → modal-0.74.6}/modal/image.pyi +0 -0
  112. {modal-0.74.4 → modal-0.74.6}/modal/io_streams.py +0 -0
  113. {modal-0.74.4 → modal-0.74.6}/modal/io_streams.pyi +0 -0
  114. {modal-0.74.4 → modal-0.74.6}/modal/mount.py +0 -0
  115. {modal-0.74.4 → modal-0.74.6}/modal/mount.pyi +0 -0
  116. {modal-0.74.4 → modal-0.74.6}/modal/network_file_system.py +0 -0
  117. {modal-0.74.4 → modal-0.74.6}/modal/network_file_system.pyi +0 -0
  118. {modal-0.74.4 → modal-0.74.6}/modal/object.py +0 -0
  119. {modal-0.74.4 → modal-0.74.6}/modal/object.pyi +0 -0
  120. {modal-0.74.4 → modal-0.74.6}/modal/output.py +0 -0
  121. {modal-0.74.4 → modal-0.74.6}/modal/parallel_map.py +0 -0
  122. {modal-0.74.4 → modal-0.74.6}/modal/parallel_map.pyi +0 -0
  123. {modal-0.74.4 → modal-0.74.6}/modal/partial_function.py +0 -0
  124. {modal-0.74.4 → modal-0.74.6}/modal/partial_function.pyi +0 -0
  125. {modal-0.74.4 → modal-0.74.6}/modal/proxy.py +0 -0
  126. {modal-0.74.4 → modal-0.74.6}/modal/proxy.pyi +0 -0
  127. {modal-0.74.4 → modal-0.74.6}/modal/py.typed +0 -0
  128. {modal-0.74.4 → modal-0.74.6}/modal/queue.py +0 -0
  129. {modal-0.74.4 → modal-0.74.6}/modal/queue.pyi +0 -0
  130. {modal-0.74.4 → modal-0.74.6}/modal/requirements/2023.12.312.txt +0 -0
  131. {modal-0.74.4 → modal-0.74.6}/modal/requirements/2023.12.txt +0 -0
  132. {modal-0.74.4 → modal-0.74.6}/modal/requirements/2024.04.txt +0 -0
  133. {modal-0.74.4 → modal-0.74.6}/modal/requirements/2024.10.txt +0 -0
  134. {modal-0.74.4 → modal-0.74.6}/modal/requirements/PREVIEW.txt +0 -0
  135. {modal-0.74.4 → modal-0.74.6}/modal/requirements/README.md +0 -0
  136. {modal-0.74.4 → modal-0.74.6}/modal/requirements/base-images.json +0 -0
  137. {modal-0.74.4 → modal-0.74.6}/modal/retries.py +0 -0
  138. {modal-0.74.4 → modal-0.74.6}/modal/runner.py +0 -0
  139. {modal-0.74.4 → modal-0.74.6}/modal/runner.pyi +0 -0
  140. {modal-0.74.4 → modal-0.74.6}/modal/running_app.py +0 -0
  141. {modal-0.74.4 → modal-0.74.6}/modal/sandbox.py +0 -0
  142. {modal-0.74.4 → modal-0.74.6}/modal/sandbox.pyi +0 -0
  143. {modal-0.74.4 → modal-0.74.6}/modal/schedule.py +0 -0
  144. {modal-0.74.4 → modal-0.74.6}/modal/scheduler_placement.py +0 -0
  145. {modal-0.74.4 → modal-0.74.6}/modal/secret.py +0 -0
  146. {modal-0.74.4 → modal-0.74.6}/modal/secret.pyi +0 -0
  147. {modal-0.74.4 → modal-0.74.6}/modal/serving.py +0 -0
  148. {modal-0.74.4 → modal-0.74.6}/modal/serving.pyi +0 -0
  149. {modal-0.74.4 → modal-0.74.6}/modal/snapshot.py +0 -0
  150. {modal-0.74.4 → modal-0.74.6}/modal/snapshot.pyi +0 -0
  151. {modal-0.74.4 → modal-0.74.6}/modal/stream_type.py +0 -0
  152. {modal-0.74.4 → modal-0.74.6}/modal/token_flow.py +0 -0
  153. {modal-0.74.4 → modal-0.74.6}/modal/token_flow.pyi +0 -0
  154. {modal-0.74.4 → modal-0.74.6}/modal/volume.py +0 -0
  155. {modal-0.74.4 → modal-0.74.6}/modal/volume.pyi +0 -0
  156. {modal-0.74.4 → modal-0.74.6}/modal.egg-info/SOURCES.txt +0 -0
  157. {modal-0.74.4 → modal-0.74.6}/modal.egg-info/dependency_links.txt +0 -0
  158. {modal-0.74.4 → modal-0.74.6}/modal.egg-info/entry_points.txt +0 -0
  159. {modal-0.74.4 → modal-0.74.6}/modal.egg-info/requires.txt +0 -0
  160. {modal-0.74.4 → modal-0.74.6}/modal.egg-info/top_level.txt +0 -0
  161. {modal-0.74.4 → modal-0.74.6}/modal_docs/__init__.py +0 -0
  162. {modal-0.74.4 → modal-0.74.6}/modal_docs/gen_cli_docs.py +0 -0
  163. {modal-0.74.4 → modal-0.74.6}/modal_docs/gen_reference_docs.py +0 -0
  164. {modal-0.74.4 → modal-0.74.6}/modal_docs/mdmd/__init__.py +0 -0
  165. {modal-0.74.4 → modal-0.74.6}/modal_docs/mdmd/mdmd.py +0 -0
  166. {modal-0.74.4 → modal-0.74.6}/modal_docs/mdmd/signatures.py +0 -0
  167. {modal-0.74.4 → modal-0.74.6}/modal_proto/__init__.py +0 -0
  168. {modal-0.74.4 → modal-0.74.6}/modal_proto/api_grpc.py +0 -0
  169. {modal-0.74.4 → modal-0.74.6}/modal_proto/api_pb2_grpc.py +0 -0
  170. {modal-0.74.4 → modal-0.74.6}/modal_proto/api_pb2_grpc.pyi +0 -0
  171. {modal-0.74.4 → modal-0.74.6}/modal_proto/modal_api_grpc.py +0 -0
  172. {modal-0.74.4 → modal-0.74.6}/modal_proto/modal_options_grpc.py +0 -0
  173. {modal-0.74.4 → modal-0.74.6}/modal_proto/options.proto +0 -0
  174. {modal-0.74.4 → modal-0.74.6}/modal_proto/options_grpc.py +0 -0
  175. {modal-0.74.4 → modal-0.74.6}/modal_proto/options_pb2.py +0 -0
  176. {modal-0.74.4 → modal-0.74.6}/modal_proto/options_pb2.pyi +0 -0
  177. {modal-0.74.4 → modal-0.74.6}/modal_proto/options_pb2_grpc.py +0 -0
  178. {modal-0.74.4 → modal-0.74.6}/modal_proto/options_pb2_grpc.pyi +0 -0
  179. {modal-0.74.4 → modal-0.74.6}/modal_proto/py.typed +0 -0
  180. {modal-0.74.4 → modal-0.74.6}/modal_version/__init__.py +0 -0
  181. {modal-0.74.4 → modal-0.74.6}/modal_version/__main__.py +0 -0
  182. {modal-0.74.4 → modal-0.74.6}/pyproject.toml +0 -0
  183. {modal-0.74.4 → modal-0.74.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.4
3
+ Version: 0.74.6
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 @@ from modal._partial_function import (
33
33
  _find_callables_for_obj,
34
34
  _PartialFunctionFlags,
35
35
  )
36
- from modal._serialization import deserialize_params
36
+ from modal._serialization import deserialize, deserialize_params
37
37
  from modal._utils.async_utils import TaskContext, synchronizer
38
38
  from modal._utils.function_utils import (
39
39
  callable_has_non_self_params,
@@ -394,7 +394,17 @@ def main(container_args: api_pb2.ContainerArguments, client: Client):
394
394
  with container_io_manager.heartbeats(is_snapshotting_function), UserCodeEventLoop() as event_loop:
395
395
  # If this is a serialized function, fetch the definition from the server
396
396
  if function_def.definition_type == api_pb2.Function.DEFINITION_TYPE_SERIALIZED:
397
- ser_usr_cls, ser_fun = container_io_manager.get_serialized_function()
397
+ assert function_def.function_serialized or function_def.class_serialized
398
+
399
+ if function_def.function_serialized:
400
+ ser_fun = deserialize(function_def.function_serialized, _client)
401
+ else:
402
+ ser_fun = None
403
+
404
+ if function_def.class_serialized:
405
+ ser_usr_cls = deserialize(function_def.class_serialized, _client)
406
+ else:
407
+ ser_usr_cls = None
398
408
  else:
399
409
  ser_usr_cls, ser_fun = None, None
400
410
 
@@ -450,28 +450,6 @@ class _ContainerIOManager:
450
450
 
451
451
  await asyncio.sleep(DYNAMIC_CONCURRENCY_INTERVAL_SECS)
452
452
 
453
- async def get_serialized_function(self) -> tuple[Optional[Any], Optional[Callable[..., Any]]]:
454
- # Fetch the serialized function definition
455
- request = api_pb2.FunctionGetSerializedRequest(function_id=self.function_id)
456
- response = await self._client.stub.FunctionGetSerialized(request)
457
- if response.function_serialized:
458
- fun = self.deserialize(response.function_serialized)
459
- else:
460
- fun = None
461
-
462
- if response.class_serialized:
463
- cls = self.deserialize(response.class_serialized)
464
- else:
465
- cls = None
466
-
467
- return cls, fun
468
-
469
- def serialize(self, obj: Any) -> bytes:
470
- return serialize(obj)
471
-
472
- def deserialize(self, data: bytes) -> Any:
473
- return deserialize(data, self._client)
474
-
475
453
  @synchronizer.no_io_translation
476
454
  def serialize_data_format(self, obj: Any, data_format: int) -> bytes:
477
455
  return serialize_data_format(obj, data_format)
@@ -680,20 +658,20 @@ class _ContainerIOManager:
680
658
 
681
659
  def serialize_exception(self, exc: BaseException) -> bytes:
682
660
  try:
683
- return self.serialize(exc)
661
+ return serialize(exc)
684
662
  except Exception as serialization_exc:
685
663
  # We can't always serialize exceptions.
686
664
  err = f"Failed to serialize exception {exc} of type {type(exc)}: {serialization_exc}"
687
665
  logger.info(err)
688
- return self.serialize(SerializationError(err))
666
+ return serialize(SerializationError(err))
689
667
 
690
668
  def serialize_traceback(self, exc: BaseException) -> tuple[Optional[bytes], Optional[bytes]]:
691
669
  serialized_tb, tb_line_cache = None, None
692
670
 
693
671
  try:
694
672
  tb_dict, line_cache = extract_traceback(exc, self.task_id)
695
- serialized_tb = self.serialize(tb_dict)
696
- tb_line_cache = self.serialize(line_cache)
673
+ serialized_tb = serialize(tb_dict)
674
+ tb_line_cache = serialize(line_cache)
697
675
  except Exception:
698
676
  logger.info("Failed to serialize exception traceback.")
699
677
 
@@ -100,11 +100,6 @@ class _ContainerIOManager:
100
100
  def stop_heartbeat(self): ...
101
101
  def dynamic_concurrency_manager(self) -> typing.AsyncContextManager[None]: ...
102
102
  async def _dynamic_concurrency_loop(self): ...
103
- async def get_serialized_function(
104
- self,
105
- ) -> tuple[typing.Optional[typing.Any], typing.Optional[collections.abc.Callable[..., typing.Any]]]: ...
106
- def serialize(self, obj: typing.Any) -> bytes: ...
107
- def deserialize(self, data: bytes) -> typing.Any: ...
108
103
  def serialize_data_format(self, obj: typing.Any, data_format: int) -> bytes: ...
109
104
  async def format_blob_data(self, data: bytes) -> dict[str, typing.Any]: ...
110
105
  def get_data_in(self, function_call_id: str) -> collections.abc.AsyncIterator[typing.Any]: ...
@@ -234,18 +229,6 @@ class ContainerIOManager:
234
229
 
235
230
  _dynamic_concurrency_loop: ___dynamic_concurrency_loop_spec[typing_extensions.Self]
236
231
 
237
- class __get_serialized_function_spec(typing_extensions.Protocol[SUPERSELF]):
238
- def __call__(
239
- self,
240
- ) -> tuple[typing.Optional[typing.Any], typing.Optional[collections.abc.Callable[..., typing.Any]]]: ...
241
- async def aio(
242
- self,
243
- ) -> tuple[typing.Optional[typing.Any], typing.Optional[collections.abc.Callable[..., typing.Any]]]: ...
244
-
245
- get_serialized_function: __get_serialized_function_spec[typing_extensions.Self]
246
-
247
- def serialize(self, obj: typing.Any) -> bytes: ...
248
- def deserialize(self, data: bytes) -> typing.Any: ...
249
232
  def serialize_data_format(self, obj: typing.Any, data_format: int) -> bytes: ...
250
233
 
251
234
  class __format_blob_data_spec(typing_extensions.Protocol[SUPERSELF]):
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.4"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.6"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.4"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.6"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.4
3
+ Version: 0.74.6
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -2946,6 +2946,9 @@ message VolumePutFiles2Request {
2946
2946
 
2947
2947
  // The blocks, in units of 8MiB, that this file consists of.
2948
2948
  repeated Block blocks = 3;
2949
+
2950
+ // Unix file permission bits `st_mode`.
2951
+ optional uint32 mode = 4;
2949
2952
  }
2950
2953
 
2951
2954
  message Block {