modal 0.77.1.dev0__py3-none-any.whl → 1.0.0__py3-none-any.whl

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 (51) hide show
  1. modal/__init__.py +10 -4
  2. modal/_functions.py +15 -90
  3. modal/_object.py +0 -14
  4. modal/_partial_function.py +4 -14
  5. modal/_serialization.py +2 -2
  6. modal/_utils/function_utils.py +3 -6
  7. modal/_utils/grpc_utils.py +6 -1
  8. modal/app.py +1 -104
  9. modal/app.pyi +0 -127
  10. modal/cli/app.py +0 -19
  11. modal/cli/programs/run_jupyter.py +1 -1
  12. modal/cli/programs/vscode.py +1 -1
  13. modal/client.pyi +2 -10
  14. modal/cls.py +9 -14
  15. modal/cls.pyi +2 -17
  16. modal/config.py +5 -16
  17. modal/container_process.py +1 -9
  18. modal/container_process.pyi +3 -3
  19. modal/dict.py +3 -5
  20. modal/environments.py +1 -3
  21. modal/exception.py +1 -1
  22. modal/functions.pyi +8 -29
  23. modal/image.py +12 -36
  24. modal/image.pyi +2 -5
  25. modal/mount.py +2 -65
  26. modal/mount.pyi +0 -1
  27. modal/network_file_system.py +3 -5
  28. modal/object.pyi +0 -6
  29. modal/queue.py +3 -5
  30. modal/runner.py +2 -19
  31. modal/runner.pyi +0 -5
  32. modal/sandbox.py +78 -32
  33. modal/sandbox.pyi +102 -7
  34. modal/secret.py +1 -3
  35. modal/serving.py +0 -6
  36. modal/serving.pyi +0 -3
  37. modal/volume.py +8 -17
  38. {modal-0.77.1.dev0.dist-info → modal-1.0.0.dist-info}/METADATA +1 -1
  39. {modal-0.77.1.dev0.dist-info → modal-1.0.0.dist-info}/RECORD +51 -51
  40. modal_proto/api.proto +29 -2
  41. modal_proto/api_grpc.py +32 -0
  42. modal_proto/api_pb2.py +788 -756
  43. modal_proto/api_pb2.pyi +86 -12
  44. modal_proto/api_pb2_grpc.py +66 -0
  45. modal_proto/api_pb2_grpc.pyi +20 -0
  46. modal_proto/modal_api_grpc.py +2 -0
  47. modal_version/__init__.py +1 -1
  48. {modal-0.77.1.dev0.dist-info → modal-1.0.0.dist-info}/WHEEL +0 -0
  49. {modal-0.77.1.dev0.dist-info → modal-1.0.0.dist-info}/entry_points.txt +0 -0
  50. {modal-0.77.1.dev0.dist-info → modal-1.0.0.dist-info}/licenses/LICENSE +0 -0
  51. {modal-0.77.1.dev0.dist-info → modal-1.0.0.dist-info}/top_level.txt +0 -0
modal_proto/api_pb2.pyi CHANGED
@@ -2193,14 +2193,11 @@ class ClassGetRequest(google.protobuf.message.Message):
2193
2193
  OBJECT_TAG_FIELD_NUMBER: builtins.int
2194
2194
  NAMESPACE_FIELD_NUMBER: builtins.int
2195
2195
  ENVIRONMENT_NAME_FIELD_NUMBER: builtins.int
2196
- LOOKUP_PUBLISHED_FIELD_NUMBER: builtins.int
2197
2196
  ONLY_CLASS_FUNCTION_FIELD_NUMBER: builtins.int
2198
2197
  app_name: builtins.str
2199
2198
  object_tag: builtins.str
2200
2199
  namespace: global___DeploymentNamespace.ValueType
2201
2200
  environment_name: builtins.str
2202
- lookup_published: builtins.bool
2203
- """Lookup class on app published by another workspace"""
2204
2201
  only_class_function: builtins.bool
2205
2202
  """True starting with 0.67.x clients, which don't create method placeholder functions"""
2206
2203
  def __init__(
@@ -2210,10 +2207,9 @@ class ClassGetRequest(google.protobuf.message.Message):
2210
2207
  object_tag: builtins.str = ...,
2211
2208
  namespace: global___DeploymentNamespace.ValueType = ...,
2212
2209
  environment_name: builtins.str = ...,
2213
- lookup_published: builtins.bool = ...,
2214
2210
  only_class_function: builtins.bool = ...,
2215
2211
  ) -> None: ...
2216
- def ClearField(self, field_name: typing_extensions.Literal["app_name", b"app_name", "environment_name", b"environment_name", "lookup_published", b"lookup_published", "namespace", b"namespace", "object_tag", b"object_tag", "only_class_function", b"only_class_function"]) -> None: ...
2212
+ def ClearField(self, field_name: typing_extensions.Literal["app_name", b"app_name", "environment_name", b"environment_name", "namespace", b"namespace", "object_tag", b"object_tag", "only_class_function", b"only_class_function"]) -> None: ...
2217
2213
 
2218
2214
  global___ClassGetRequest = ClassGetRequest
2219
2215
 
@@ -4177,6 +4173,7 @@ class Function(google.protobuf.message.Message):
4177
4173
  AUTOSCALER_SETTINGS_FIELD_NUMBER: builtins.int
4178
4174
  FUNCTION_SCHEMA_FIELD_NUMBER: builtins.int
4179
4175
  EXPERIMENTAL_OPTIONS_FIELD_NUMBER: builtins.int
4176
+ MOUNT_CLIENT_DEPENDENCIES_FIELD_NUMBER: builtins.int
4180
4177
  module_name: builtins.str
4181
4178
  function_name: builtins.str
4182
4179
  @property
@@ -4305,6 +4302,10 @@ class Function(google.protobuf.message.Message):
4305
4302
  Note the value type as string. Internally we'll coerce all values to string with str().
4306
4303
  On the server, it's necessary to convert back to the most natural type (e.g. int) when relevant.
4307
4304
  """
4305
+ mount_client_dependencies: builtins.bool
4306
+ """If set, client deps will be mounted into the container, and are
4307
+ no longer expected to exist in the image itself.
4308
+ """
4308
4309
  def __init__(
4309
4310
  self,
4310
4311
  *,
@@ -4376,9 +4377,10 @@ class Function(google.protobuf.message.Message):
4376
4377
  autoscaler_settings: global___AutoscalerSettings | None = ...,
4377
4378
  function_schema: global___FunctionSchema | None = ...,
4378
4379
  experimental_options: collections.abc.Mapping[builtins.str, builtins.str] | None = ...,
4380
+ mount_client_dependencies: builtins.bool = ...,
4379
4381
  ) -> None: ...
4380
4382
  def HasField(self, field_name: typing_extensions.Literal["X_experimental_proxy_ip", b"X_experimental_proxy_ip", "_cloud_provider", b"_cloud_provider", "_experimental_proxy_ip", b"_experimental_proxy_ip", "_proxy_id", b"_proxy_id", "_scheduler_placement", b"_scheduler_placement", "autoscaler_settings", b"autoscaler_settings", "checkpoint", b"checkpoint", "class_parameter_info", b"class_parameter_info", "cloud_provider", b"cloud_provider", "function_schema", b"function_schema", "proxy_id", b"proxy_id", "pty_info", b"pty_info", "rate_limit", b"rate_limit", "resources", b"resources", "retry_policy", b"retry_policy", "schedule", b"schedule", "scheduler_placement", b"scheduler_placement", "web_url_info", b"web_url_info", "webhook_config", b"webhook_config"]) -> builtins.bool: ...
4381
- def ClearField(self, field_name: typing_extensions.Literal["X_experimental_proxy_ip", b"X_experimental_proxy_ip", "_cloud_provider", b"_cloud_provider", "_experimental_buffer_containers", b"_experimental_buffer_containers", "_experimental_concurrent_cancellations", b"_experimental_concurrent_cancellations", "_experimental_custom_scaling", b"_experimental_custom_scaling", "_experimental_enable_gpu_snapshot", b"_experimental_enable_gpu_snapshot", "_experimental_group_size", b"_experimental_group_size", "_experimental_proxy_ip", b"_experimental_proxy_ip", "_experimental_task_templates", b"_experimental_task_templates", "_experimental_task_templates_enabled", b"_experimental_task_templates_enabled", "_proxy_id", b"_proxy_id", "_scheduler_placement", b"_scheduler_placement", "app_name", b"app_name", "autoscaler_settings", b"autoscaler_settings", "batch_linger_ms", b"batch_linger_ms", "batch_max_size", b"batch_max_size", "block_network", b"block_network", "checkpoint", b"checkpoint", "checkpointing_enabled", b"checkpointing_enabled", "class_parameter_info", b"class_parameter_info", "class_serialized", b"class_serialized", "cloud_bucket_mounts", b"cloud_bucket_mounts", "cloud_provider", b"cloud_provider", "cloud_provider_str", b"cloud_provider_str", "concurrency_limit", b"concurrency_limit", "custom_domain_info", b"custom_domain_info", "definition_type", b"definition_type", "experimental_options", b"experimental_options", "function_name", b"function_name", "function_schema", b"function_schema", "function_serialized", b"function_serialized", "function_type", b"function_type", "i6pn_enabled", b"i6pn_enabled", "image_id", b"image_id", "is_auto_snapshot", b"is_auto_snapshot", "is_builder_function", b"is_builder_function", "is_checkpointing_function", b"is_checkpointing_function", "is_class", b"is_class", "is_method", b"is_method", "max_concurrent_inputs", b"max_concurrent_inputs", "max_inputs", b"max_inputs", "method_definitions", b"method_definitions", "method_definitions_set", b"method_definitions_set", "module_name", b"module_name", "mount_ids", b"mount_ids", "object_dependencies", b"object_dependencies", "proxy_id", b"proxy_id", "pty_info", b"pty_info", "rate_limit", b"rate_limit", "resources", b"resources", "retry_policy", b"retry_policy", "runtime", b"runtime", "runtime_debug", b"runtime_debug", "runtime_perf_record", b"runtime_perf_record", "s3_mounts", b"s3_mounts", "schedule", b"schedule", "scheduler_placement", b"scheduler_placement", "secret_ids", b"secret_ids", "shared_volume_mounts", b"shared_volume_mounts", "snapshot_debug", b"snapshot_debug", "target_concurrent_inputs", b"target_concurrent_inputs", "task_idle_timeout_secs", b"task_idle_timeout_secs", "timeout_secs", b"timeout_secs", "untrusted", b"untrusted", "use_function_id", b"use_function_id", "use_method_name", b"use_method_name", "volume_mounts", b"volume_mounts", "warm_pool_size", b"warm_pool_size", "web_url", b"web_url", "web_url_info", b"web_url_info", "webhook_config", b"webhook_config", "worker_id", b"worker_id"]) -> None: ...
4383
+ def ClearField(self, field_name: typing_extensions.Literal["X_experimental_proxy_ip", b"X_experimental_proxy_ip", "_cloud_provider", b"_cloud_provider", "_experimental_buffer_containers", b"_experimental_buffer_containers", "_experimental_concurrent_cancellations", b"_experimental_concurrent_cancellations", "_experimental_custom_scaling", b"_experimental_custom_scaling", "_experimental_enable_gpu_snapshot", b"_experimental_enable_gpu_snapshot", "_experimental_group_size", b"_experimental_group_size", "_experimental_proxy_ip", b"_experimental_proxy_ip", "_experimental_task_templates", b"_experimental_task_templates", "_experimental_task_templates_enabled", b"_experimental_task_templates_enabled", "_proxy_id", b"_proxy_id", "_scheduler_placement", b"_scheduler_placement", "app_name", b"app_name", "autoscaler_settings", b"autoscaler_settings", "batch_linger_ms", b"batch_linger_ms", "batch_max_size", b"batch_max_size", "block_network", b"block_network", "checkpoint", b"checkpoint", "checkpointing_enabled", b"checkpointing_enabled", "class_parameter_info", b"class_parameter_info", "class_serialized", b"class_serialized", "cloud_bucket_mounts", b"cloud_bucket_mounts", "cloud_provider", b"cloud_provider", "cloud_provider_str", b"cloud_provider_str", "concurrency_limit", b"concurrency_limit", "custom_domain_info", b"custom_domain_info", "definition_type", b"definition_type", "experimental_options", b"experimental_options", "function_name", b"function_name", "function_schema", b"function_schema", "function_serialized", b"function_serialized", "function_type", b"function_type", "i6pn_enabled", b"i6pn_enabled", "image_id", b"image_id", "is_auto_snapshot", b"is_auto_snapshot", "is_builder_function", b"is_builder_function", "is_checkpointing_function", b"is_checkpointing_function", "is_class", b"is_class", "is_method", b"is_method", "max_concurrent_inputs", b"max_concurrent_inputs", "max_inputs", b"max_inputs", "method_definitions", b"method_definitions", "method_definitions_set", b"method_definitions_set", "module_name", b"module_name", "mount_client_dependencies", b"mount_client_dependencies", "mount_ids", b"mount_ids", "object_dependencies", b"object_dependencies", "proxy_id", b"proxy_id", "pty_info", b"pty_info", "rate_limit", b"rate_limit", "resources", b"resources", "retry_policy", b"retry_policy", "runtime", b"runtime", "runtime_debug", b"runtime_debug", "runtime_perf_record", b"runtime_perf_record", "s3_mounts", b"s3_mounts", "schedule", b"schedule", "scheduler_placement", b"scheduler_placement", "secret_ids", b"secret_ids", "shared_volume_mounts", b"shared_volume_mounts", "snapshot_debug", b"snapshot_debug", "target_concurrent_inputs", b"target_concurrent_inputs", "task_idle_timeout_secs", b"task_idle_timeout_secs", "timeout_secs", b"timeout_secs", "untrusted", b"untrusted", "use_function_id", b"use_function_id", "use_method_name", b"use_method_name", "volume_mounts", b"volume_mounts", "warm_pool_size", b"warm_pool_size", "web_url", b"web_url", "web_url_info", b"web_url_info", "webhook_config", b"webhook_config", "worker_id", b"worker_id"]) -> None: ...
4382
4384
  @typing.overload
4383
4385
  def WhichOneof(self, oneof_group: typing_extensions.Literal["X_experimental_proxy_ip", b"X_experimental_proxy_ip"]) -> typing_extensions.Literal["_experimental_proxy_ip"] | None: ...
4384
4386
  @typing.overload
@@ -6280,6 +6282,8 @@ class ImageMetadata(google.protobuf.message.Message):
6280
6282
  PYTHON_VERSION_INFO_FIELD_NUMBER: builtins.int
6281
6283
  PYTHON_PACKAGES_FIELD_NUMBER: builtins.int
6282
6284
  WORKDIR_FIELD_NUMBER: builtins.int
6285
+ LIBC_VERSION_INFO_FIELD_NUMBER: builtins.int
6286
+ IMAGE_BUILDER_VERSION_FIELD_NUMBER: builtins.int
6283
6287
  python_version_info: builtins.str
6284
6288
  """The output of `python -VV. Not set if missing"""
6285
6289
  @property
@@ -6289,15 +6293,25 @@ class ImageMetadata(google.protobuf.message.Message):
6289
6293
  """
6290
6294
  workdir: builtins.str
6291
6295
  """The work directory of the image, defaulting to "/". Not set if missing"""
6296
+ libc_version_info: builtins.str
6297
+ """The image's libc version"""
6298
+ image_builder_version: builtins.str
6299
+ """The builder version for/with which the image was created."""
6292
6300
  def __init__(
6293
6301
  self,
6294
6302
  *,
6295
6303
  python_version_info: builtins.str | None = ...,
6296
6304
  python_packages: collections.abc.Mapping[builtins.str, builtins.str] | None = ...,
6297
6305
  workdir: builtins.str | None = ...,
6306
+ libc_version_info: builtins.str | None = ...,
6307
+ image_builder_version: builtins.str | None = ...,
6298
6308
  ) -> None: ...
6299
- def HasField(self, field_name: typing_extensions.Literal["_python_version_info", b"_python_version_info", "_workdir", b"_workdir", "python_version_info", b"python_version_info", "workdir", b"workdir"]) -> builtins.bool: ...
6300
- def ClearField(self, field_name: typing_extensions.Literal["_python_version_info", b"_python_version_info", "_workdir", b"_workdir", "python_packages", b"python_packages", "python_version_info", b"python_version_info", "workdir", b"workdir"]) -> None: ...
6309
+ def HasField(self, field_name: typing_extensions.Literal["_image_builder_version", b"_image_builder_version", "_libc_version_info", b"_libc_version_info", "_python_version_info", b"_python_version_info", "_workdir", b"_workdir", "image_builder_version", b"image_builder_version", "libc_version_info", b"libc_version_info", "python_version_info", b"python_version_info", "workdir", b"workdir"]) -> builtins.bool: ...
6310
+ def ClearField(self, field_name: typing_extensions.Literal["_image_builder_version", b"_image_builder_version", "_libc_version_info", b"_libc_version_info", "_python_version_info", b"_python_version_info", "_workdir", b"_workdir", "image_builder_version", b"image_builder_version", "libc_version_info", b"libc_version_info", "python_packages", b"python_packages", "python_version_info", b"python_version_info", "workdir", b"workdir"]) -> None: ...
6311
+ @typing.overload
6312
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_image_builder_version", b"_image_builder_version"]) -> typing_extensions.Literal["image_builder_version"] | None: ...
6313
+ @typing.overload
6314
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_libc_version_info", b"_libc_version_info"]) -> typing_extensions.Literal["libc_version_info"] | None: ...
6301
6315
  @typing.overload
6302
6316
  def WhichOneof(self, oneof_group: typing_extensions.Literal["_python_version_info", b"_python_version_info"]) -> typing_extensions.Literal["python_version_info"] | None: ...
6303
6317
  @typing.overload
@@ -9067,7 +9081,7 @@ class TaskLogs(google.protobuf.message.Message):
9067
9081
  TASK_PROGRESS_FIELD_NUMBER: builtins.int
9068
9082
  FUNCTION_CALL_ID_FIELD_NUMBER: builtins.int
9069
9083
  INPUT_ID_FIELD_NUMBER: builtins.int
9070
- ID_FIELD_NUMBER: builtins.int
9084
+ TIMESTAMP_NS_FIELD_NUMBER: builtins.int
9071
9085
  data: builtins.str
9072
9086
  task_state: global___TaskState.ValueType
9073
9087
  timestamp: builtins.float
@@ -9076,7 +9090,7 @@ class TaskLogs(google.protobuf.message.Message):
9076
9090
  def task_progress(self) -> global___TaskProgress: ...
9077
9091
  function_call_id: builtins.str
9078
9092
  input_id: builtins.str
9079
- id: builtins.str
9093
+ timestamp_ns: builtins.int
9080
9094
  def __init__(
9081
9095
  self,
9082
9096
  *,
@@ -9087,10 +9101,10 @@ class TaskLogs(google.protobuf.message.Message):
9087
9101
  task_progress: global___TaskProgress | None = ...,
9088
9102
  function_call_id: builtins.str = ...,
9089
9103
  input_id: builtins.str = ...,
9090
- id: builtins.str = ...,
9104
+ timestamp_ns: builtins.int = ...,
9091
9105
  ) -> None: ...
9092
9106
  def HasField(self, field_name: typing_extensions.Literal["task_progress", b"task_progress"]) -> builtins.bool: ...
9093
- def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "file_descriptor", b"file_descriptor", "function_call_id", b"function_call_id", "id", b"id", "input_id", b"input_id", "task_progress", b"task_progress", "task_state", b"task_state", "timestamp", b"timestamp"]) -> None: ...
9107
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "file_descriptor", b"file_descriptor", "function_call_id", b"function_call_id", "input_id", b"input_id", "task_progress", b"task_progress", "task_state", b"task_state", "timestamp", b"timestamp", "timestamp_ns", b"timestamp_ns"]) -> None: ...
9094
9108
 
9095
9109
  global___TaskLogs = TaskLogs
9096
9110
 
@@ -9690,6 +9704,46 @@ class VolumeHeartbeatRequest(google.protobuf.message.Message):
9690
9704
 
9691
9705
  global___VolumeHeartbeatRequest = VolumeHeartbeatRequest
9692
9706
 
9707
+ class VolumeListFiles2Request(google.protobuf.message.Message):
9708
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
9709
+
9710
+ VOLUME_ID_FIELD_NUMBER: builtins.int
9711
+ PATH_FIELD_NUMBER: builtins.int
9712
+ RECURSIVE_FIELD_NUMBER: builtins.int
9713
+ MAX_ENTRIES_FIELD_NUMBER: builtins.int
9714
+ volume_id: builtins.str
9715
+ path: builtins.str
9716
+ recursive: builtins.bool
9717
+ max_entries: builtins.int
9718
+ def __init__(
9719
+ self,
9720
+ *,
9721
+ volume_id: builtins.str = ...,
9722
+ path: builtins.str = ...,
9723
+ recursive: builtins.bool = ...,
9724
+ max_entries: builtins.int | None = ...,
9725
+ ) -> None: ...
9726
+ def HasField(self, field_name: typing_extensions.Literal["_max_entries", b"_max_entries", "max_entries", b"max_entries"]) -> builtins.bool: ...
9727
+ def ClearField(self, field_name: typing_extensions.Literal["_max_entries", b"_max_entries", "max_entries", b"max_entries", "path", b"path", "recursive", b"recursive", "volume_id", b"volume_id"]) -> None: ...
9728
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_max_entries", b"_max_entries"]) -> typing_extensions.Literal["max_entries"] | None: ...
9729
+
9730
+ global___VolumeListFiles2Request = VolumeListFiles2Request
9731
+
9732
+ class VolumeListFiles2Response(google.protobuf.message.Message):
9733
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
9734
+
9735
+ ENTRIES_FIELD_NUMBER: builtins.int
9736
+ @property
9737
+ def entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileEntry]: ...
9738
+ def __init__(
9739
+ self,
9740
+ *,
9741
+ entries: collections.abc.Iterable[global___FileEntry] | None = ...,
9742
+ ) -> None: ...
9743
+ def ClearField(self, field_name: typing_extensions.Literal["entries", b"entries"]) -> None: ...
9744
+
9745
+ global___VolumeListFiles2Response = VolumeListFiles2Response
9746
+
9693
9747
  class VolumeListFilesRequest(google.protobuf.message.Message):
9694
9748
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
9695
9749
 
@@ -9994,6 +10048,26 @@ class VolumeReloadRequest(google.protobuf.message.Message):
9994
10048
 
9995
10049
  global___VolumeReloadRequest = VolumeReloadRequest
9996
10050
 
10051
+ class VolumeRemoveFile2Request(google.protobuf.message.Message):
10052
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
10053
+
10054
+ VOLUME_ID_FIELD_NUMBER: builtins.int
10055
+ PATH_FIELD_NUMBER: builtins.int
10056
+ RECURSIVE_FIELD_NUMBER: builtins.int
10057
+ volume_id: builtins.str
10058
+ path: builtins.str
10059
+ recursive: builtins.bool
10060
+ def __init__(
10061
+ self,
10062
+ *,
10063
+ volume_id: builtins.str = ...,
10064
+ path: builtins.str = ...,
10065
+ recursive: builtins.bool = ...,
10066
+ ) -> None: ...
10067
+ def ClearField(self, field_name: typing_extensions.Literal["path", b"path", "recursive", b"recursive", "volume_id", b"volume_id"]) -> None: ...
10068
+
10069
+ global___VolumeRemoveFile2Request = VolumeRemoveFile2Request
10070
+
9997
10071
  class VolumeRemoveFileRequest(google.protobuf.message.Message):
9998
10072
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
9999
10073
 
@@ -740,6 +740,11 @@ class ModalClientStub(object):
740
740
  request_serializer=modal__proto_dot_api__pb2.VolumeListFilesRequest.SerializeToString,
741
741
  response_deserializer=modal__proto_dot_api__pb2.VolumeListFilesResponse.FromString,
742
742
  )
743
+ self.VolumeListFiles2 = channel.unary_stream(
744
+ '/modal.client.ModalClient/VolumeListFiles2',
745
+ request_serializer=modal__proto_dot_api__pb2.VolumeListFiles2Request.SerializeToString,
746
+ response_deserializer=modal__proto_dot_api__pb2.VolumeListFiles2Response.FromString,
747
+ )
743
748
  self.VolumePutFiles = channel.unary_unary(
744
749
  '/modal.client.ModalClient/VolumePutFiles',
745
750
  request_serializer=modal__proto_dot_api__pb2.VolumePutFilesRequest.SerializeToString,
@@ -760,6 +765,11 @@ class ModalClientStub(object):
760
765
  request_serializer=modal__proto_dot_api__pb2.VolumeRemoveFileRequest.SerializeToString,
761
766
  response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
762
767
  )
768
+ self.VolumeRemoveFile2 = channel.unary_unary(
769
+ '/modal.client.ModalClient/VolumeRemoveFile2',
770
+ request_serializer=modal__proto_dot_api__pb2.VolumeRemoveFile2Request.SerializeToString,
771
+ response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
772
+ )
763
773
  self.VolumeRename = channel.unary_unary(
764
774
  '/modal.client.ModalClient/VolumeRename',
765
775
  request_serializer=modal__proto_dot_api__pb2.VolumeRenameRequest.SerializeToString,
@@ -1674,6 +1684,12 @@ class ModalClientServicer(object):
1674
1684
  context.set_details('Method not implemented!')
1675
1685
  raise NotImplementedError('Method not implemented!')
1676
1686
 
1687
+ def VolumeListFiles2(self, request, context):
1688
+ """Missing associated documentation comment in .proto file."""
1689
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
1690
+ context.set_details('Method not implemented!')
1691
+ raise NotImplementedError('Method not implemented!')
1692
+
1677
1693
  def VolumePutFiles(self, request, context):
1678
1694
  """Missing associated documentation comment in .proto file."""
1679
1695
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -1698,6 +1714,12 @@ class ModalClientServicer(object):
1698
1714
  context.set_details('Method not implemented!')
1699
1715
  raise NotImplementedError('Method not implemented!')
1700
1716
 
1717
+ def VolumeRemoveFile2(self, request, context):
1718
+ """Missing associated documentation comment in .proto file."""
1719
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
1720
+ context.set_details('Method not implemented!')
1721
+ raise NotImplementedError('Method not implemented!')
1722
+
1701
1723
  def VolumeRename(self, request, context):
1702
1724
  """Missing associated documentation comment in .proto file."""
1703
1725
  context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -2439,6 +2461,11 @@ def add_ModalClientServicer_to_server(servicer, server):
2439
2461
  request_deserializer=modal__proto_dot_api__pb2.VolumeListFilesRequest.FromString,
2440
2462
  response_serializer=modal__proto_dot_api__pb2.VolumeListFilesResponse.SerializeToString,
2441
2463
  ),
2464
+ 'VolumeListFiles2': grpc.unary_stream_rpc_method_handler(
2465
+ servicer.VolumeListFiles2,
2466
+ request_deserializer=modal__proto_dot_api__pb2.VolumeListFiles2Request.FromString,
2467
+ response_serializer=modal__proto_dot_api__pb2.VolumeListFiles2Response.SerializeToString,
2468
+ ),
2442
2469
  'VolumePutFiles': grpc.unary_unary_rpc_method_handler(
2443
2470
  servicer.VolumePutFiles,
2444
2471
  request_deserializer=modal__proto_dot_api__pb2.VolumePutFilesRequest.FromString,
@@ -2459,6 +2486,11 @@ def add_ModalClientServicer_to_server(servicer, server):
2459
2486
  request_deserializer=modal__proto_dot_api__pb2.VolumeRemoveFileRequest.FromString,
2460
2487
  response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
2461
2488
  ),
2489
+ 'VolumeRemoveFile2': grpc.unary_unary_rpc_method_handler(
2490
+ servicer.VolumeRemoveFile2,
2491
+ request_deserializer=modal__proto_dot_api__pb2.VolumeRemoveFile2Request.FromString,
2492
+ response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
2493
+ ),
2462
2494
  'VolumeRename': grpc.unary_unary_rpc_method_handler(
2463
2495
  servicer.VolumeRename,
2464
2496
  request_deserializer=modal__proto_dot_api__pb2.VolumeRenameRequest.FromString,
@@ -4944,6 +4976,23 @@ class ModalClient(object):
4944
4976
  options, channel_credentials,
4945
4977
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
4946
4978
 
4979
+ @staticmethod
4980
+ def VolumeListFiles2(request,
4981
+ target,
4982
+ options=(),
4983
+ channel_credentials=None,
4984
+ call_credentials=None,
4985
+ insecure=False,
4986
+ compression=None,
4987
+ wait_for_ready=None,
4988
+ timeout=None,
4989
+ metadata=None):
4990
+ return grpc.experimental.unary_stream(request, target, '/modal.client.ModalClient/VolumeListFiles2',
4991
+ modal__proto_dot_api__pb2.VolumeListFiles2Request.SerializeToString,
4992
+ modal__proto_dot_api__pb2.VolumeListFiles2Response.FromString,
4993
+ options, channel_credentials,
4994
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
4995
+
4947
4996
  @staticmethod
4948
4997
  def VolumePutFiles(request,
4949
4998
  target,
@@ -5012,6 +5061,23 @@ class ModalClient(object):
5012
5061
  options, channel_credentials,
5013
5062
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
5014
5063
 
5064
+ @staticmethod
5065
+ def VolumeRemoveFile2(request,
5066
+ target,
5067
+ options=(),
5068
+ channel_credentials=None,
5069
+ call_credentials=None,
5070
+ insecure=False,
5071
+ compression=None,
5072
+ wait_for_ready=None,
5073
+ timeout=None,
5074
+ metadata=None):
5075
+ return grpc.experimental.unary_unary(request, target, '/modal.client.ModalClient/VolumeRemoveFile2',
5076
+ modal__proto_dot_api__pb2.VolumeRemoveFile2Request.SerializeToString,
5077
+ google_dot_protobuf_dot_empty__pb2.Empty.FromString,
5078
+ options, channel_credentials,
5079
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
5080
+
5015
5081
  @staticmethod
5016
5082
  def VolumeRename(request,
5017
5083
  target,
@@ -620,6 +620,10 @@ class ModalClientStub:
620
620
  modal_proto.api_pb2.VolumeListFilesRequest,
621
621
  modal_proto.api_pb2.VolumeListFilesResponse,
622
622
  ]
623
+ VolumeListFiles2: grpc.UnaryStreamMultiCallable[
624
+ modal_proto.api_pb2.VolumeListFiles2Request,
625
+ modal_proto.api_pb2.VolumeListFiles2Response,
626
+ ]
623
627
  VolumePutFiles: grpc.UnaryUnaryMultiCallable[
624
628
  modal_proto.api_pb2.VolumePutFilesRequest,
625
629
  google.protobuf.empty_pb2.Empty,
@@ -636,6 +640,10 @@ class ModalClientStub:
636
640
  modal_proto.api_pb2.VolumeRemoveFileRequest,
637
641
  google.protobuf.empty_pb2.Empty,
638
642
  ]
643
+ VolumeRemoveFile2: grpc.UnaryUnaryMultiCallable[
644
+ modal_proto.api_pb2.VolumeRemoveFile2Request,
645
+ google.protobuf.empty_pb2.Empty,
646
+ ]
639
647
  VolumeRename: grpc.UnaryUnaryMultiCallable[
640
648
  modal_proto.api_pb2.VolumeRenameRequest,
641
649
  google.protobuf.empty_pb2.Empty,
@@ -1548,6 +1556,12 @@ class ModalClientServicer(metaclass=abc.ABCMeta):
1548
1556
  context: grpc.ServicerContext,
1549
1557
  ) -> collections.abc.Iterator[modal_proto.api_pb2.VolumeListFilesResponse]: ...
1550
1558
  @abc.abstractmethod
1559
+ def VolumeListFiles2(
1560
+ self,
1561
+ request: modal_proto.api_pb2.VolumeListFiles2Request,
1562
+ context: grpc.ServicerContext,
1563
+ ) -> collections.abc.Iterator[modal_proto.api_pb2.VolumeListFiles2Response]: ...
1564
+ @abc.abstractmethod
1551
1565
  def VolumePutFiles(
1552
1566
  self,
1553
1567
  request: modal_proto.api_pb2.VolumePutFilesRequest,
@@ -1572,6 +1586,12 @@ class ModalClientServicer(metaclass=abc.ABCMeta):
1572
1586
  context: grpc.ServicerContext,
1573
1587
  ) -> google.protobuf.empty_pb2.Empty: ...
1574
1588
  @abc.abstractmethod
1589
+ def VolumeRemoveFile2(
1590
+ self,
1591
+ request: modal_proto.api_pb2.VolumeRemoveFile2Request,
1592
+ context: grpc.ServicerContext,
1593
+ ) -> google.protobuf.empty_pb2.Empty: ...
1594
+ @abc.abstractmethod
1575
1595
  def VolumeRename(
1576
1596
  self,
1577
1597
  request: modal_proto.api_pb2.VolumeRenameRequest,
@@ -163,9 +163,11 @@ class ModalClientModal:
163
163
  self.VolumeHeartbeat = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeHeartbeat, client, server_url)
164
164
  self.VolumeList = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeList, client, server_url)
165
165
  self.VolumeListFiles = modal.client.UnaryStreamWrapper(grpclib_stub.VolumeListFiles, client, server_url)
166
+ self.VolumeListFiles2 = modal.client.UnaryStreamWrapper(grpclib_stub.VolumeListFiles2, client, server_url)
166
167
  self.VolumePutFiles = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumePutFiles, client, server_url)
167
168
  self.VolumePutFiles2 = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumePutFiles2, client, server_url)
168
169
  self.VolumeReload = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeReload, client, server_url)
169
170
  self.VolumeRemoveFile = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeRemoveFile, client, server_url)
171
+ self.VolumeRemoveFile2 = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeRemoveFile2, client, server_url)
170
172
  self.VolumeRename = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeRename, client, server_url)
171
173
  self.WorkspaceNameLookup = modal.client.UnaryUnaryWrapper(grpclib_stub.WorkspaceNameLookup, client, server_url)
modal_version/__init__.py CHANGED
@@ -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__ = "0.77.1.dev0"
4
+ __version__ = "1.0.0"