modal 1.1.5.dev66__py3-none-any.whl → 1.3.1.dev8__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 (143) hide show
  1. modal/__init__.py +4 -4
  2. modal/__main__.py +4 -29
  3. modal/_billing.py +84 -0
  4. modal/_clustered_functions.py +1 -3
  5. modal/_container_entrypoint.py +33 -208
  6. modal/_functions.py +171 -138
  7. modal/_grpc_client.py +191 -0
  8. modal/_ipython.py +16 -6
  9. modal/_load_context.py +106 -0
  10. modal/_object.py +72 -21
  11. modal/_output.py +12 -14
  12. modal/_partial_function.py +31 -4
  13. modal/_resolver.py +44 -57
  14. modal/_runtime/container_io_manager.py +30 -28
  15. modal/_runtime/container_io_manager.pyi +42 -44
  16. modal/_runtime/gpu_memory_snapshot.py +9 -7
  17. modal/_runtime/user_code_event_loop.py +80 -0
  18. modal/_runtime/user_code_imports.py +236 -10
  19. modal/_serialization.py +2 -1
  20. modal/_traceback.py +4 -13
  21. modal/_tunnel.py +16 -11
  22. modal/_tunnel.pyi +25 -3
  23. modal/_utils/async_utils.py +337 -10
  24. modal/_utils/auth_token_manager.py +1 -4
  25. modal/_utils/blob_utils.py +29 -22
  26. modal/_utils/function_utils.py +20 -21
  27. modal/_utils/grpc_testing.py +6 -3
  28. modal/_utils/grpc_utils.py +223 -64
  29. modal/_utils/mount_utils.py +26 -1
  30. modal/_utils/name_utils.py +2 -3
  31. modal/_utils/package_utils.py +0 -1
  32. modal/_utils/rand_pb_testing.py +8 -1
  33. modal/_utils/task_command_router_client.py +524 -0
  34. modal/_vendor/cloudpickle.py +144 -48
  35. modal/app.py +285 -105
  36. modal/app.pyi +216 -53
  37. modal/billing.py +5 -0
  38. modal/builder/2025.06.txt +6 -3
  39. modal/builder/PREVIEW.txt +2 -1
  40. modal/builder/base-images.json +4 -2
  41. modal/cli/_download.py +19 -3
  42. modal/cli/cluster.py +4 -2
  43. modal/cli/config.py +3 -1
  44. modal/cli/container.py +5 -4
  45. modal/cli/dict.py +5 -2
  46. modal/cli/entry_point.py +26 -2
  47. modal/cli/environment.py +2 -16
  48. modal/cli/launch.py +1 -76
  49. modal/cli/network_file_system.py +5 -20
  50. modal/cli/programs/run_jupyter.py +1 -1
  51. modal/cli/programs/vscode.py +1 -1
  52. modal/cli/queues.py +5 -4
  53. modal/cli/run.py +24 -204
  54. modal/cli/secret.py +1 -2
  55. modal/cli/shell.py +375 -0
  56. modal/cli/utils.py +1 -13
  57. modal/cli/volume.py +11 -17
  58. modal/client.py +16 -125
  59. modal/client.pyi +94 -144
  60. modal/cloud_bucket_mount.py +3 -1
  61. modal/cloud_bucket_mount.pyi +4 -0
  62. modal/cls.py +101 -64
  63. modal/cls.pyi +9 -8
  64. modal/config.py +21 -1
  65. modal/container_process.py +288 -12
  66. modal/container_process.pyi +99 -38
  67. modal/dict.py +72 -33
  68. modal/dict.pyi +88 -57
  69. modal/environments.py +16 -8
  70. modal/environments.pyi +6 -2
  71. modal/exception.py +154 -16
  72. modal/experimental/__init__.py +24 -53
  73. modal/experimental/flash.py +161 -74
  74. modal/experimental/flash.pyi +97 -49
  75. modal/file_io.py +50 -92
  76. modal/file_io.pyi +117 -89
  77. modal/functions.pyi +70 -87
  78. modal/image.py +82 -47
  79. modal/image.pyi +51 -30
  80. modal/io_streams.py +500 -149
  81. modal/io_streams.pyi +279 -189
  82. modal/mount.py +60 -46
  83. modal/mount.pyi +41 -17
  84. modal/network_file_system.py +19 -11
  85. modal/network_file_system.pyi +72 -39
  86. modal/object.pyi +114 -22
  87. modal/parallel_map.py +42 -44
  88. modal/parallel_map.pyi +9 -17
  89. modal/partial_function.pyi +4 -2
  90. modal/proxy.py +14 -6
  91. modal/proxy.pyi +10 -2
  92. modal/queue.py +45 -38
  93. modal/queue.pyi +88 -52
  94. modal/runner.py +96 -96
  95. modal/runner.pyi +44 -27
  96. modal/sandbox.py +225 -107
  97. modal/sandbox.pyi +226 -60
  98. modal/secret.py +58 -56
  99. modal/secret.pyi +28 -13
  100. modal/serving.py +7 -11
  101. modal/serving.pyi +7 -8
  102. modal/snapshot.py +29 -15
  103. modal/snapshot.pyi +18 -10
  104. modal/token_flow.py +1 -1
  105. modal/token_flow.pyi +4 -6
  106. modal/volume.py +102 -55
  107. modal/volume.pyi +125 -66
  108. {modal-1.1.5.dev66.dist-info → modal-1.3.1.dev8.dist-info}/METADATA +10 -9
  109. modal-1.3.1.dev8.dist-info/RECORD +189 -0
  110. modal_proto/api.proto +141 -70
  111. modal_proto/api_grpc.py +42 -26
  112. modal_proto/api_pb2.py +1123 -1103
  113. modal_proto/api_pb2.pyi +331 -83
  114. modal_proto/api_pb2_grpc.py +80 -48
  115. modal_proto/api_pb2_grpc.pyi +26 -18
  116. modal_proto/modal_api_grpc.py +175 -174
  117. modal_proto/task_command_router.proto +164 -0
  118. modal_proto/task_command_router_grpc.py +138 -0
  119. modal_proto/task_command_router_pb2.py +180 -0
  120. modal_proto/{sandbox_router_pb2.pyi → task_command_router_pb2.pyi} +148 -57
  121. modal_proto/task_command_router_pb2_grpc.py +272 -0
  122. modal_proto/task_command_router_pb2_grpc.pyi +100 -0
  123. modal_version/__init__.py +1 -1
  124. modal_version/__main__.py +1 -1
  125. modal/cli/programs/launch_instance_ssh.py +0 -94
  126. modal/cli/programs/run_marimo.py +0 -95
  127. modal-1.1.5.dev66.dist-info/RECORD +0 -191
  128. modal_proto/modal_options_grpc.py +0 -3
  129. modal_proto/options.proto +0 -19
  130. modal_proto/options_grpc.py +0 -3
  131. modal_proto/options_pb2.py +0 -35
  132. modal_proto/options_pb2.pyi +0 -20
  133. modal_proto/options_pb2_grpc.py +0 -4
  134. modal_proto/options_pb2_grpc.pyi +0 -7
  135. modal_proto/sandbox_router.proto +0 -125
  136. modal_proto/sandbox_router_grpc.py +0 -89
  137. modal_proto/sandbox_router_pb2.py +0 -128
  138. modal_proto/sandbox_router_pb2_grpc.py +0 -169
  139. modal_proto/sandbox_router_pb2_grpc.pyi +0 -63
  140. {modal-1.1.5.dev66.dist-info → modal-1.3.1.dev8.dist-info}/WHEEL +0 -0
  141. {modal-1.1.5.dev66.dist-info → modal-1.3.1.dev8.dist-info}/entry_points.txt +0 -0
  142. {modal-1.1.5.dev66.dist-info → modal-1.3.1.dev8.dist-info}/licenses/LICENSE +0 -0
  143. {modal-1.1.5.dev66.dist-info → modal-1.3.1.dev8.dist-info}/top_level.txt +0 -0
modal_proto/api_grpc.py CHANGED
@@ -9,7 +9,7 @@ import grpclib.client
9
9
  if typing.TYPE_CHECKING:
10
10
  import grpclib.server
11
11
 
12
- import modal_proto.options_pb2
12
+ import google.protobuf.any_pb2
13
13
  import google.protobuf.empty_pb2
14
14
  import google.protobuf.struct_pb2
15
15
  import google.protobuf.timestamp_pb2
@@ -55,6 +55,10 @@ class ModalClientBase(abc.ABC):
55
55
  async def AppGetOrCreate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AppGetOrCreateRequest, modal_proto.api_pb2.AppGetOrCreateResponse]') -> None:
56
56
  pass
57
57
 
58
+ @abc.abstractmethod
59
+ async def AppGetTags(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AppGetTagsRequest, modal_proto.api_pb2.AppGetTagsResponse]') -> None:
60
+ pass
61
+
58
62
  @abc.abstractmethod
59
63
  async def AppHeartbeat(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AppHeartbeatRequest, google.protobuf.empty_pb2.Empty]') -> None:
60
64
  pass
@@ -79,6 +83,10 @@ class ModalClientBase(abc.ABC):
79
83
  async def AppSetObjects(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AppSetObjectsRequest, google.protobuf.empty_pb2.Empty]') -> None:
80
84
  pass
81
85
 
86
+ @abc.abstractmethod
87
+ async def AppSetTags(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AppSetTagsRequest, google.protobuf.empty_pb2.Empty]') -> None:
88
+ pass
89
+
82
90
  @abc.abstractmethod
83
91
  async def AppStop(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.AppStopRequest, google.protobuf.empty_pb2.Empty]') -> None:
84
92
  pass
@@ -475,10 +483,6 @@ class ModalClientBase(abc.ABC):
475
483
  async def SandboxCreateConnectToken(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxCreateConnectTokenRequest, modal_proto.api_pb2.SandboxCreateConnectTokenResponse]') -> None:
476
484
  pass
477
485
 
478
- @abc.abstractmethod
479
- async def SandboxGetCommandRouterAccess(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest, modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse]') -> None:
480
- pass
481
-
482
486
  @abc.abstractmethod
483
487
  async def SandboxGetFromName(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetFromNameRequest, modal_proto.api_pb2.SandboxGetFromNameResponse]') -> None:
484
488
  pass
@@ -608,7 +612,7 @@ class ModalClientBase(abc.ABC):
608
612
  pass
609
613
 
610
614
  @abc.abstractmethod
611
- async def TaskGetAutoscalingMetrics(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.TaskGetAutoscalingMetricsRequest, modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse]') -> None:
615
+ async def TaskGetCommandRouterAccess(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.TaskGetCommandRouterAccessRequest, modal_proto.api_pb2.TaskGetCommandRouterAccessResponse]') -> None:
612
616
  pass
613
617
 
614
618
  @abc.abstractmethod
@@ -767,6 +771,12 @@ class ModalClientBase(abc.ABC):
767
771
  modal_proto.api_pb2.AppGetOrCreateRequest,
768
772
  modal_proto.api_pb2.AppGetOrCreateResponse,
769
773
  ),
774
+ '/modal.client.ModalClient/AppGetTags': grpclib.const.Handler(
775
+ self.AppGetTags,
776
+ grpclib.const.Cardinality.UNARY_UNARY,
777
+ modal_proto.api_pb2.AppGetTagsRequest,
778
+ modal_proto.api_pb2.AppGetTagsResponse,
779
+ ),
770
780
  '/modal.client.ModalClient/AppHeartbeat': grpclib.const.Handler(
771
781
  self.AppHeartbeat,
772
782
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -803,6 +813,12 @@ class ModalClientBase(abc.ABC):
803
813
  modal_proto.api_pb2.AppSetObjectsRequest,
804
814
  google.protobuf.empty_pb2.Empty,
805
815
  ),
816
+ '/modal.client.ModalClient/AppSetTags': grpclib.const.Handler(
817
+ self.AppSetTags,
818
+ grpclib.const.Cardinality.UNARY_UNARY,
819
+ modal_proto.api_pb2.AppSetTagsRequest,
820
+ google.protobuf.empty_pb2.Empty,
821
+ ),
806
822
  '/modal.client.ModalClient/AppStop': grpclib.const.Handler(
807
823
  self.AppStop,
808
824
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1397,12 +1413,6 @@ class ModalClientBase(abc.ABC):
1397
1413
  modal_proto.api_pb2.SandboxCreateConnectTokenRequest,
1398
1414
  modal_proto.api_pb2.SandboxCreateConnectTokenResponse,
1399
1415
  ),
1400
- '/modal.client.ModalClient/SandboxGetCommandRouterAccess': grpclib.const.Handler(
1401
- self.SandboxGetCommandRouterAccess,
1402
- grpclib.const.Cardinality.UNARY_UNARY,
1403
- modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest,
1404
- modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse,
1405
- ),
1406
1416
  '/modal.client.ModalClient/SandboxGetFromName': grpclib.const.Handler(
1407
1417
  self.SandboxGetFromName,
1408
1418
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1595,11 +1605,11 @@ class ModalClientBase(abc.ABC):
1595
1605
  google.protobuf.empty_pb2.Empty,
1596
1606
  modal_proto.api_pb2.TaskCurrentInputsResponse,
1597
1607
  ),
1598
- '/modal.client.ModalClient/TaskGetAutoscalingMetrics': grpclib.const.Handler(
1599
- self.TaskGetAutoscalingMetrics,
1608
+ '/modal.client.ModalClient/TaskGetCommandRouterAccess': grpclib.const.Handler(
1609
+ self.TaskGetCommandRouterAccess,
1600
1610
  grpclib.const.Cardinality.UNARY_UNARY,
1601
- modal_proto.api_pb2.TaskGetAutoscalingMetricsRequest,
1602
- modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse,
1611
+ modal_proto.api_pb2.TaskGetCommandRouterAccessRequest,
1612
+ modal_proto.api_pb2.TaskGetCommandRouterAccessResponse,
1603
1613
  ),
1604
1614
  '/modal.client.ModalClient/TaskList': grpclib.const.Handler(
1605
1615
  self.TaskList,
@@ -1811,6 +1821,12 @@ class ModalClientStub:
1811
1821
  modal_proto.api_pb2.AppGetOrCreateRequest,
1812
1822
  modal_proto.api_pb2.AppGetOrCreateResponse,
1813
1823
  )
1824
+ self.AppGetTags = grpclib.client.UnaryUnaryMethod(
1825
+ channel,
1826
+ '/modal.client.ModalClient/AppGetTags',
1827
+ modal_proto.api_pb2.AppGetTagsRequest,
1828
+ modal_proto.api_pb2.AppGetTagsResponse,
1829
+ )
1814
1830
  self.AppHeartbeat = grpclib.client.UnaryUnaryMethod(
1815
1831
  channel,
1816
1832
  '/modal.client.ModalClient/AppHeartbeat',
@@ -1847,6 +1863,12 @@ class ModalClientStub:
1847
1863
  modal_proto.api_pb2.AppSetObjectsRequest,
1848
1864
  google.protobuf.empty_pb2.Empty,
1849
1865
  )
1866
+ self.AppSetTags = grpclib.client.UnaryUnaryMethod(
1867
+ channel,
1868
+ '/modal.client.ModalClient/AppSetTags',
1869
+ modal_proto.api_pb2.AppSetTagsRequest,
1870
+ google.protobuf.empty_pb2.Empty,
1871
+ )
1850
1872
  self.AppStop = grpclib.client.UnaryUnaryMethod(
1851
1873
  channel,
1852
1874
  '/modal.client.ModalClient/AppStop',
@@ -2441,12 +2463,6 @@ class ModalClientStub:
2441
2463
  modal_proto.api_pb2.SandboxCreateConnectTokenRequest,
2442
2464
  modal_proto.api_pb2.SandboxCreateConnectTokenResponse,
2443
2465
  )
2444
- self.SandboxGetCommandRouterAccess = grpclib.client.UnaryUnaryMethod(
2445
- channel,
2446
- '/modal.client.ModalClient/SandboxGetCommandRouterAccess',
2447
- modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest,
2448
- modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse,
2449
- )
2450
2466
  self.SandboxGetFromName = grpclib.client.UnaryUnaryMethod(
2451
2467
  channel,
2452
2468
  '/modal.client.ModalClient/SandboxGetFromName',
@@ -2639,11 +2655,11 @@ class ModalClientStub:
2639
2655
  google.protobuf.empty_pb2.Empty,
2640
2656
  modal_proto.api_pb2.TaskCurrentInputsResponse,
2641
2657
  )
2642
- self.TaskGetAutoscalingMetrics = grpclib.client.UnaryUnaryMethod(
2658
+ self.TaskGetCommandRouterAccess = grpclib.client.UnaryUnaryMethod(
2643
2659
  channel,
2644
- '/modal.client.ModalClient/TaskGetAutoscalingMetrics',
2645
- modal_proto.api_pb2.TaskGetAutoscalingMetricsRequest,
2646
- modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse,
2660
+ '/modal.client.ModalClient/TaskGetCommandRouterAccess',
2661
+ modal_proto.api_pb2.TaskGetCommandRouterAccessRequest,
2662
+ modal_proto.api_pb2.TaskGetCommandRouterAccessResponse,
2647
2663
  )
2648
2664
  self.TaskList = grpclib.client.UnaryUnaryMethod(
2649
2665
  channel,