modal 0.66.17__py3-none-any.whl → 0.66.44__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.
Files changed (43) hide show
  1. modal/_container_entrypoint.py +5 -342
  2. modal/_runtime/container_io_manager.py +6 -14
  3. modal/_runtime/user_code_imports.py +361 -0
  4. modal/_utils/function_utils.py +28 -8
  5. modal/_utils/grpc_testing.py +33 -26
  6. modal/app.py +13 -46
  7. modal/cli/import_refs.py +4 -38
  8. modal/client.pyi +2 -2
  9. modal/cls.py +26 -19
  10. modal/cls.pyi +4 -4
  11. modal/dict.py +0 -6
  12. modal/dict.pyi +0 -4
  13. modal/experimental.py +0 -3
  14. modal/functions.py +42 -38
  15. modal/functions.pyi +9 -13
  16. modal/gpu.py +8 -6
  17. modal/image.py +141 -7
  18. modal/image.pyi +34 -4
  19. modal/io_streams.py +40 -33
  20. modal/io_streams.pyi +13 -13
  21. modal/mount.py +5 -2
  22. modal/network_file_system.py +0 -28
  23. modal/network_file_system.pyi +0 -14
  24. modal/partial_function.py +12 -2
  25. modal/queue.py +0 -6
  26. modal/queue.pyi +0 -4
  27. modal/sandbox.py +1 -1
  28. modal/volume.py +0 -22
  29. modal/volume.pyi +0 -9
  30. {modal-0.66.17.dist-info → modal-0.66.44.dist-info}/METADATA +1 -2
  31. {modal-0.66.17.dist-info → modal-0.66.44.dist-info}/RECORD +43 -42
  32. modal_proto/api.proto +3 -20
  33. modal_proto/api_grpc.py +0 -16
  34. modal_proto/api_pb2.py +389 -413
  35. modal_proto/api_pb2.pyi +12 -58
  36. modal_proto/api_pb2_grpc.py +0 -33
  37. modal_proto/api_pb2_grpc.pyi +0 -10
  38. modal_proto/modal_api_grpc.py +0 -1
  39. modal_version/_version_generated.py +1 -1
  40. {modal-0.66.17.dist-info → modal-0.66.44.dist-info}/LICENSE +0 -0
  41. {modal-0.66.17.dist-info → modal-0.66.44.dist-info}/WHEEL +0 -0
  42. {modal-0.66.17.dist-info → modal-0.66.44.dist-info}/entry_points.txt +0 -0
  43. {modal-0.66.17.dist-info → modal-0.66.44.dist-info}/top_level.txt +0 -0
modal/partial_function.py CHANGED
@@ -91,7 +91,7 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
91
91
  if obj: # accessing the method on an instance of a class, e.g. `MyClass().fun``
92
92
  if hasattr(obj, "_modal_functions"):
93
93
  # This happens inside "local" user methods when they refer to other methods,
94
- # e.g. Foo().parent_method() doing self.local.other_method()
94
+ # e.g. Foo().parent_method.remote() calling self.other_method.remote()
95
95
  return getattr(obj, "_modal_functions")[k]
96
96
  else:
97
97
  # special edge case: referencing a method of an instance of an
@@ -199,6 +199,7 @@ class _MethodDecoratorType:
199
199
  ...
200
200
 
201
201
 
202
+ # TODO(elias): fix support for coroutine type unwrapping for methods (static typing)
202
203
  def _method(
203
204
  _warn_parentheses_missing=None,
204
205
  *,
@@ -207,7 +208,6 @@ def _method(
207
208
  is_generator: Optional[bool] = None,
208
209
  keep_warm: Optional[int] = None, # Deprecated: Use keep_warm on @app.cls() instead
209
210
  ) -> _MethodDecoratorType:
210
- # TODO(elias): fix support for coroutine type unwrapping for methods (static typing)
211
211
  """Decorator for methods that should be transformed into a Modal Function registered against this class's App.
212
212
 
213
213
  **Usage:**
@@ -379,6 +379,11 @@ def _asgi_app(
379
379
  f"Modal will drop support for default parameters in a future release.",
380
380
  )
381
381
 
382
+ if inspect.iscoroutinefunction(raw_f):
383
+ raise InvalidError(
384
+ f"ASGI app function {raw_f.__name__} is an async function. Only sync Python functions are supported."
385
+ )
386
+
382
387
  if not wait_for_response:
383
388
  deprecation_error(
384
389
  (2024, 5, 13),
@@ -448,6 +453,11 @@ def _wsgi_app(
448
453
  f"Modal will drop support for default parameters in a future release.",
449
454
  )
450
455
 
456
+ if inspect.iscoroutinefunction(raw_f):
457
+ raise InvalidError(
458
+ f"WSGI app function {raw_f.__name__} is an async function. Only sync Python functions are supported."
459
+ )
460
+
451
461
  if not wait_for_response:
452
462
  deprecation_error(
453
463
  (2024, 5, 13),
modal/queue.py CHANGED
@@ -175,12 +175,6 @@ class _Queue(_Object, type_prefix="qu"):
175
175
 
176
176
  return _Queue._from_loader(_load, "Queue()", is_another_app=True, hydrate_lazily=True)
177
177
 
178
- @staticmethod
179
- def persisted(label: str, namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE, environment_name: Optional[str] = None):
180
- """mdmd:hidden"""
181
- message = "`Queue.persisted` is deprecated. Please use `Queue.from_name(name, create_if_missing=True)` instead."
182
- deprecation_error((2024, 3, 1), message)
183
-
184
178
  @staticmethod
185
179
  async def lookup(
186
180
  label: str,
modal/queue.pyi CHANGED
@@ -22,8 +22,6 @@ class _Queue(modal.object._Object):
22
22
  label: str, namespace=1, environment_name: typing.Optional[str] = None, create_if_missing: bool = False
23
23
  ) -> _Queue: ...
24
24
  @staticmethod
25
- def persisted(label: str, namespace=1, environment_name: typing.Optional[str] = None): ...
26
- @staticmethod
27
25
  async def lookup(
28
26
  label: str,
29
27
  namespace=1,
@@ -104,8 +102,6 @@ class Queue(modal.object.Object):
104
102
  def from_name(
105
103
  label: str, namespace=1, environment_name: typing.Optional[str] = None, create_if_missing: bool = False
106
104
  ) -> Queue: ...
107
- @staticmethod
108
- def persisted(label: str, namespace=1, environment_name: typing.Optional[str] = None): ...
109
105
 
110
106
  class __lookup_spec(typing_extensions.Protocol):
111
107
  def __call__(
modal/sandbox.py CHANGED
@@ -148,7 +148,7 @@ class _Sandbox(_Object, type_prefix="sb"):
148
148
  definition = api_pb2.Sandbox(
149
149
  entrypoint_args=entrypoint_args,
150
150
  image_id=image.object_id,
151
- mount_ids=[mount.object_id for mount in mounts],
151
+ mount_ids=[mount.object_id for mount in mounts] + [mount.object_id for mount in image._mount_layers],
152
152
  secret_ids=[secret.object_id for secret in secrets],
153
153
  timeout_secs=timeout,
154
154
  workdir=workdir,
modal/volume.py CHANGED
@@ -79,15 +79,6 @@ class FileEntry:
79
79
  size=proto.size,
80
80
  )
81
81
 
82
- def __getattr__(self, name: str):
83
- deprecation_error(
84
- (2024, 4, 15),
85
- (
86
- f"The FileEntry dataclass was introduced to replace a private Protobuf message. "
87
- f"This dataclass does not have the {name} attribute."
88
- ),
89
- )
90
-
91
82
 
92
83
  class _Volume(_Object, type_prefix="vo"):
93
84
  """A writeable volume that can be used to share files between one or more Modal functions.
@@ -222,19 +213,6 @@ class _Volume(_Object, type_prefix="vo"):
222
213
  tc.infinite_loop(lambda: client.stub.VolumeHeartbeat(request), sleep=_heartbeat_sleep)
223
214
  yield cls._new_hydrated(response.volume_id, client, None, is_another_app=True)
224
215
 
225
- @staticmethod
226
- def persisted(
227
- label: str,
228
- namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
229
- environment_name: Optional[str] = None,
230
- cloud: Optional[str] = None,
231
- ):
232
- """mdmd:hidden"""
233
- message = (
234
- "`Volume.persisted` is deprecated. Please use `Volume.from_name(name, create_if_missing=True)` instead."
235
- )
236
- deprecation_error((2024, 3, 1), message)
237
-
238
216
  @staticmethod
239
217
  async def lookup(
240
218
  label: str,
modal/volume.pyi CHANGED
@@ -25,7 +25,6 @@ class FileEntry:
25
25
 
26
26
  @classmethod
27
27
  def _from_proto(cls, proto: modal_proto.api_pb2.FileEntry) -> FileEntry: ...
28
- def __getattr__(self, name: str): ...
29
28
  def __init__(self, path: str, type: FileEntryType, mtime: int, size: int) -> None: ...
30
29
  def __repr__(self): ...
31
30
  def __eq__(self, other): ...
@@ -56,10 +55,6 @@ class _Volume(modal.object._Object):
56
55
  _heartbeat_sleep: float = 300,
57
56
  ) -> typing.AsyncContextManager[_Volume]: ...
58
57
  @staticmethod
59
- def persisted(
60
- label: str, namespace=1, environment_name: typing.Optional[str] = None, cloud: typing.Optional[str] = None
61
- ): ...
62
- @staticmethod
63
58
  async def lookup(
64
59
  label: str,
65
60
  namespace=1,
@@ -149,10 +144,6 @@ class Volume(modal.object.Object):
149
144
  version: typing.Optional[int] = None,
150
145
  _heartbeat_sleep: float = 300,
151
146
  ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[Volume]: ...
152
- @staticmethod
153
- def persisted(
154
- label: str, namespace=1, environment_name: typing.Optional[str] = None, cloud: typing.Optional[str] = None
155
- ): ...
156
147
 
157
148
  class __lookup_spec(typing_extensions.Protocol):
158
149
  def __call__(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.66.17
3
+ Version: 0.66.44
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -15,7 +15,6 @@ Requires-Python: >=3.9
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: aiohttp
18
- Requires-Dist: aiostream (~=0.5.2)
19
18
  Requires-Dist: certifi
20
19
  Requires-Dist: click (>=8.1.0)
21
20
  Requires-Dist: fastapi
@@ -2,7 +2,7 @@ modal/__init__.py,sha256=Yn8zS7Jxl5uZjPM331Pc4FdSmp9Rt6VdE7TiE4ZKRc8,2151
2
2
  modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
3
3
  modal/_clustered_functions.py,sha256=58spAmCbOk8eyjFKW-H21W-FGyYiJmfpEMK4BnTEUrk,2706
4
4
  modal/_clustered_functions.pyi,sha256=UQ7DHiQFI3A2Z8kC3gltNHJkQfvgvPuSbFsse9lSPkw,785
5
- modal/_container_entrypoint.py,sha256=HLr7F4aOnpyBpAAxAaxZC664pflQn2lbssyXYfUvc7I,42099
5
+ modal/_container_entrypoint.py,sha256=qP7TRT92_wKlxR-XuLg1FzJ7w4oknlrWDlp68XE0CwQ,28670
6
6
  modal/_ipython.py,sha256=HF_DYy0e0qM9WnGDmTY30s1RxzGya9GeORCauCEpRaE,450
7
7
  modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
8
8
  modal/_output.py,sha256=SMaLrf1btBzHTV_tH5NzA8ZTWNJh5J0b31iG3sQU8_4,25494
@@ -15,52 +15,52 @@ modal/_traceback.py,sha256=1yNp1Dqq4qRIQp8idDp5PEqjwH4eA8MNI0FhFkCOFgo,4408
15
15
  modal/_tunnel.py,sha256=SVmQxGbV7dcLwyY9eB2PIWmXw8QQmcKg2ppTcRQgZrU,6283
16
16
  modal/_tunnel.pyi,sha256=SA_Q0UGB-D9skFjv6CqlTnCEWU67a2xJxfwVdXtar3Y,1259
17
17
  modal/_watcher.py,sha256=STlDe73R7IS33a_GMW2HnDc3hCDKLdsBfMxRpVh-flA,3581
18
- modal/app.py,sha256=sECTGUkkQceBdaaJG2TW3TKSyRQjxZL4UFBrJcgew9I,45869
18
+ modal/app.py,sha256=QEBK8qYSrux36oi3iS3msBQmcUOS1r4s2nengzzynjQ,44658
19
19
  modal/app.pyi,sha256=wHwBIDqkUb2CQzYVhxZafJ8xZ17TZ-8y-cRyOeZsEm0,25182
20
20
  modal/call_graph.py,sha256=l-Wi6vM8aosCdHTWegcCyGeVJGFdZ_fzlCmbRVPBXFI,2593
21
21
  modal/client.py,sha256=4SpWb4n0nolITR36kADZl1tYLOg6avukmzZU56UQjCo,16385
22
- modal/client.pyi,sha256=iv2plo_FKRx-0x9kf9aTrSE4e_fOQE8RJNo8Q9crweE,7372
22
+ modal/client.pyi,sha256=G8PEZZNj243tqHX-HnfOm5hyUADo34xQEiOLCpPVVxU,7372
23
23
  modal/cloud_bucket_mount.py,sha256=eWQhCtMIczpokjfTZEgNBCGO_s5ft46PqTSLfKBykq4,5748
24
24
  modal/cloud_bucket_mount.pyi,sha256=tTF7M4FR9bTA30cFkz8qq3ZTlFL19NHU_36e_5GgAGA,1424
25
- modal/cls.py,sha256=Ci7EtMrLm1LExfjZ9K2IXyj-SV9Syq8dAbZCEfddcmY,24234
26
- modal/cls.pyi,sha256=Dr4kgq8cj7YGRf9ayInuogOxs6yHim5_562Om8Avu14,8332
25
+ modal/cls.py,sha256=apKnBOHKYEpBiMC8mRvHtCDJl1g0vP0tG1r8mUZ1yH0,24684
26
+ modal/cls.pyi,sha256=om3xQuHTMu7q_32BDKJjAz4oP_7Z5JWV27kyDKTPFI8,8332
27
27
  modal/config.py,sha256=oVmvclQ2Qlt-VmL3wEp8DgDrnTPh_K5UBEYrSXv4C4s,10928
28
28
  modal/container_process.py,sha256=c_jBPtyPeSxbIcbLfs_FzTrt-1eErtRSnsfxkDozFoY,5589
29
29
  modal/container_process.pyi,sha256=k2kClwaSzz11eci1pzFZgCm-ptXapHAyHTOENorlazA,2594
30
- modal/dict.py,sha256=zZVE48RcysuY-FGZ1dPF-T9Dfjtax4htKuD4kwCLPpI,12905
31
- modal/dict.pyi,sha256=4ogy8Z6XNyZ1DLN1Tv9a3vN9LTeHoGSw8LoqwPyibNw,7449
30
+ modal/dict.py,sha256=axbUKiXhgOVvE1IrNMK3uHg3rp3N0Uji5elQNijnhH4,12571
31
+ modal/dict.pyi,sha256=4Rh5HNzXk99hotPUzoj1kYOHNlEgndZFfA-hlmBtBIc,7223
32
32
  modal/environments.py,sha256=KwKdrWfSnz2XF5eYXZyd0kdac1x1PVw2uxPYsGy8cys,6517
33
33
  modal/environments.pyi,sha256=oScvFAclF55-tL9UioLIL_SPBwgy_9O-BBvJ-PLbRgY,3542
34
34
  modal/exception.py,sha256=K-czk1oK8wFvK8snWrytXSByo2WNb9SJAlgBVPGWZBs,6417
35
- modal/experimental.py,sha256=lN6Zj18XxXCxZu2JNI3vdaehIqXQYlhv3UvR5h97jD4,2305
36
- modal/functions.py,sha256=BUFuwR3vVQOodFn31B8yfiRBwluktHlrlFJ-5uMfo_k,71718
37
- modal/functions.pyi,sha256=NNQ99RPpP9orbwigl5BaXWJtcvl6sEyjFapzCT3mjkY,24949
38
- modal/gpu.py,sha256=fAmMfh_GZpYwmNndWgDnU2snpFFaA1EeVQOHBEnRoVI,6682
39
- modal/image.py,sha256=40iKoSUrKtar1tT689zF1QuVaIcMmLsoU7rr1NCQbQ4,71798
40
- modal/image.pyi,sha256=tjZeFHmLP9bsX8rINg0dYZ8tz-xpFr5z04Wt0GRwc0E,22820
41
- modal/io_streams.py,sha256=kZ5o-aK0lPg4-NezYxpCFmjS2Vf_TbWn49S7c2xUQ6U,14255
42
- modal/io_streams.pyi,sha256=pn6UnOjCUjQwukPYiHHdCv92CH9S9YRb_WekKGoPN94,4350
43
- modal/mount.py,sha256=kWEz3yFdoVa0XFp3SA9HfaH7kSO7K_mMNHnm_e3tbDo,27616
35
+ modal/experimental.py,sha256=jFuNbwrNHos47viMB9q-cHJSvf2RDxDdoEcss9plaZE,2302
36
+ modal/functions.py,sha256=BxccB-3a1migZQ6JA6iiHZJQ7WQ-jYpmg9DEZoTxzcc,71639
37
+ modal/functions.pyi,sha256=5JGM4Mhpm674Ia7h3OTsPBmZA32goyOs2oBCCUG8A3I,24800
38
+ modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
39
+ modal/image.py,sha256=j-NH8pLWk4jd5UOGD4y6W7DHWoeb3rG_VR7zPLSqj-Q,78927
40
+ modal/image.pyi,sha256=QEjjnl4ZSmqt7toHww5ZbhL2Re5qaFGgH7qADcJS_vA,24493
41
+ modal/io_streams.py,sha256=XUsNsxRzDrhkjyb2Hx0hugCoOEz266SHQF8wP-VgsfY,14582
42
+ modal/io_streams.pyi,sha256=WJmSI1WvZITUNBO7mnIuJgYdSKdbLaHk10V4GbttAVw,4452
43
+ modal/mount.py,sha256=QZ4nabpbNU9tjLIPCq86rlHor9CXzADMkhJWBYfKKgg,27750
44
44
  modal/mount.pyi,sha256=nywUmeUELLY2OEnAc1NNBHmSxuEylTWBzkh6nuXkkuc,9965
45
- modal/network_file_system.py,sha256=CRABD7SbJ9vFqDnY2e4DCXPBkX5LQS43zMeUTG_cbJg,15020
46
- modal/network_file_system.pyi,sha256=x-d3w2acvi5HUDJ7fjSi45DSpyioTa15FEC7StPMriI,7863
45
+ modal/network_file_system.py,sha256=P_LsILecyda1SRHU76Hk4Lq3M1HSx9shFJbaLThzw0U,14071
46
+ modal/network_file_system.pyi,sha256=XLyUnDx55ExbJcF_xlKxRax_r06XTvSsQh-a-_EyCOU,7239
47
47
  modal/object.py,sha256=zbRFZIt-Z3NQtgZPzlcEdy7u36ug4tKAuntYQBR3sDM,9625
48
48
  modal/object.pyi,sha256=cwWg93H4rBk9evt1itLZAZXH5wUMyTJBZ_ADazgfjGg,8465
49
49
  modal/output.py,sha256=FtPR7yvjZMgdSKD_KYkIcwYgCOiV9EKYjaj7K55Hjvg,1940
50
50
  modal/parallel_map.py,sha256=lf8Wer6FAf8-dYqPqoL45cz7FYDU66-TF-h5CO2Kf5Q,16052
51
51
  modal/parallel_map.pyi,sha256=pOhT0P3DDYlwLx0fR3PTsecA7DI8uOdXC1N8i-ZkyOY,2328
52
- modal/partial_function.py,sha256=RNsdmgmQgE_lxDJPvtu6KgbF0NhxWMvwU4FLCiKIdG8,27786
52
+ modal/partial_function.py,sha256=xkEqMPG0rnP_BUDqGikerv6uiWxDkwZdIFSdoHMDm2A,28216
53
53
  modal/partial_function.pyi,sha256=BqKN7It5QLxS2yhhhDX0RgI8EyNMPBD6Duk21kN_fvA,8908
54
54
  modal/proxy.py,sha256=ZrOsuQP7dSZFq1OrIxalNnt0Zvsnp1h86Th679sSL40,1417
55
55
  modal/proxy.pyi,sha256=UvygdOYneLTuoDY6hVaMNCyZ947Tmx93IdLjErUqkvM,368
56
56
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- modal/queue.py,sha256=9t56h-JQTV6lrgaSdoy7VjLD9wpbaRU1ZaxURuDyQBE,18674
58
- modal/queue.pyi,sha256=uDPnIe-DVEz0b6mRsfRIHQd9Py6rqaBu3A3Nex-DZL4,10225
57
+ modal/queue.py,sha256=qCBE-V2QRl_taSDUR5bDJL91J0A8xwbTxfEU3taA4Es,18338
58
+ modal/queue.pyi,sha256=t5yhDqXRtexy7AVraCexPyT6Xo3QA_H5OxVe_JLzTps,9999
59
59
  modal/retries.py,sha256=z4dYXdksUcjkefM3vGLkhCQ_m_TUPLJgC4uSYDzWSOU,3750
60
60
  modal/runner.py,sha256=ZHHuPQ130pZzHdm8vOVQx6db4FiEg3SheDNyShVn9Jg,23805
61
61
  modal/runner.pyi,sha256=b2qoID4HO-ww6Q0jdboR9iCTxVWTzGiC2taIx7kA-U0,5135
62
62
  modal/running_app.py,sha256=AhWWCB16_k5R80oQxEVSNrmRq3fVInUCxtXKrAvcEPQ,566
63
- modal/sandbox.py,sha256=DL-UW4AJOJPm9Wqm5LDBSNjpREOc-DxHkdgp-68HIk0,24825
63
+ modal/sandbox.py,sha256=_7_sqTrEiC2zFo1XN7UCHA1L9NFXj6Kb6xu6Ecfancg,24878
64
64
  modal/sandbox.pyi,sha256=LIh3cIs9Wm0x2WBpyLqmlOvqJYB2806sO4JCIJRQOi4,17231
65
65
  modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
66
66
  modal/scheduler_placement.py,sha256=2B7CAR4UMUu5AtFVWgwVFDjkKtppwKY6ek7gD0jzBYI,1208
@@ -71,19 +71,20 @@ modal/serving.pyi,sha256=0KWUH5rdYnihSv1XB8bK9GokzpfzrCq8Sf6nYlUvQI8,1689
71
71
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
72
72
  modal/token_flow.py,sha256=lsVpJACut76AeJLw44vJKMSlpcqp8wcvxdUOoX6CIOc,6754
73
73
  modal/token_flow.pyi,sha256=qEYP7grgqSA440w7kBREU9Ezeo_NxCT67OciIPgDzcc,1958
74
- modal/volume.py,sha256=7T1Ckgg4KQp4ci9ZCaET6LeMDqQAim61PwdPT_uVAGQ,29644
75
- modal/volume.pyi,sha256=Uca9Ws9isk7zzPKo55oG3oGWh5ZK9LqjWYQznMaR8J8,11354
74
+ modal/volume.py,sha256=PfwXajTBuZdxwQv2lHRqzfchn39I77pRiC60Ga1EJo4,28914
75
+ modal/volume.pyi,sha256=JbeGYBda2mctzyK2psAen4nnfFB2v3jEB7S7Oyv_Vm0,10986
76
76
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
77
77
  modal/_runtime/asgi.py,sha256=WoAwIiGKpk089MOca3_iA73h36v0uBuoPx0-87ajIDY,19843
78
- modal/_runtime/container_io_manager.py,sha256=FesoR2WVEdGhZgOo5XXldCznGNt5krc-ht1IxyANCCY,44202
78
+ modal/_runtime/container_io_manager.py,sha256=_MEhwyCSYeCaPQnztPxkm0anRXa3CPcwIKi403N53uo,44120
79
79
  modal/_runtime/execution_context.py,sha256=cXEVY4wEK-oZJVJptyj1ZplZvVQ1HDzFsyHxhaY4o8M,2718
80
80
  modal/_runtime/telemetry.py,sha256=3NbrfwYH6mvDckzdTppymmda2lQKX2oHGc2JwdFZdUc,5191
81
+ modal/_runtime/user_code_imports.py,sha256=2COhqA77zwbP__-DWiDHEScHM-Go3CmI-AlKvT_oBOU,14545
81
82
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
82
83
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
83
84
  modal/_utils/async_utils.py,sha256=3H4pBC4DW6rCA6hgRux6FMxGqPgHM-G-BTs7KXZiWz4,23958
84
85
  modal/_utils/blob_utils.py,sha256=pAY22w0oVc6ujGfI7La7HPUMOf42FehIapuhSDeeqEs,15835
85
- modal/_utils/function_utils.py,sha256=5GnYUiQ-WiRDEPt1H1_SFd0rZNJLWEXz7NrlMV5oV2E,23220
86
- modal/_utils/grpc_testing.py,sha256=PQyzEjHBveW7vdqu5Tpn-aNWPO5RPPcsRWzGvXDHCxY,7931
86
+ modal/_utils/function_utils.py,sha256=28mxgg_-7JF1DDiNnp3iNVsFQkOzMFjORsetdvZZTHU,24475
87
+ modal/_utils/grpc_testing.py,sha256=LOzWygTdHINzV-o_Ajbl7sOFbUQFoonP0iKpsJjA_nc,8301
87
88
  modal/_utils/grpc_utils.py,sha256=tM1Q32VOU2WG733IfVHTLZdiyCe8Ga0f0Dx0iDLLy_8,7724
88
89
  modal/_utils/hash_utils.py,sha256=HefF7zPQPxFxyx3fpz-AdSm4QsHZNNvgL9-iQHY-_F4,1790
89
90
  modal/_utils/http_utils.py,sha256=VKXYNPJtrSwZ1ttcXVGQUWmn8cLAXiOTv05g2ac3GbU,2179
@@ -107,7 +108,7 @@ modal/cli/container.py,sha256=LGrF9iz8D3PGst6IUl0VB1Y1LJ0BWLrNRNFxWa4z-tg,3199
107
108
  modal/cli/dict.py,sha256=lIEl6uxygFt3omC-oF6tHUxnFjVhy4d0InC_kZrlkvM,4454
108
109
  modal/cli/entry_point.py,sha256=aaNxFAqZcmtSjwzkYIA_Ba9CkL4cL4_i2gy5VjoXxkM,4228
109
110
  modal/cli/environment.py,sha256=eq8Rixbo8u-nJPvtGwW4-I1lXZPnevsFEv65WlSxFXY,4362
110
- modal/cli/import_refs.py,sha256=Qk5jrX4ffrJZbT4H1I1y0jXkqfMLZ1pJhpyY6d5DihE,10616
111
+ modal/cli/import_refs.py,sha256=0sYZLcgcnor_CECq-7yX3WBs1W55nz5y65sbysxxKzY,9267
111
112
  modal/cli/launch.py,sha256=aY1fXxZyGn1Ih0lAzuAvzpXP6_OxvVCoZCgCIyV9Vos,2692
112
113
  modal/cli/network_file_system.py,sha256=p_o3wu8rh2tjHXJYrjaad__pD8hv93ypeDtfSY2fSEU,7527
113
114
  modal/cli/profile.py,sha256=s4jCYHwriOorEFCKxeGZoSWX8rXTR_hDTNFZhOA565s,3109
@@ -141,13 +142,13 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
141
142
  modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
142
143
  modal_global_objects/mounts/python_standalone.py,sha256=_vTEX3PECUsatzhDs8lyJmDK0LbFetT1sJB6MIDfFAo,1870
143
144
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
144
- modal_proto/api.proto,sha256=QsQ-8pSlOD8Rhvva2s87oboGMiv-c7gMGCNFu927-JI,77889
145
- modal_proto/api_grpc.py,sha256=Oic0aLG4XTLqmV3FeZCPzu7uYjQdOKGBA-p9VPUv9P0,99828
146
- modal_proto/api_pb2.py,sha256=lI2pjdr-GTwM-PTynHG_k_hzX25syvLiie-_G0NWfeI,284685
147
- modal_proto/api_pb2.pyi,sha256=cZCuWD7GDRM_JrKjqiNlAUU5JXpv9o0ATowBblR9Dlc,380235
148
- modal_proto/api_pb2_grpc.py,sha256=A2CXteL4pT6DtC98xvjHcqLF9vcC8JMy2w1xLdq0Qj8,215861
149
- modal_proto/api_pb2_grpc.pyi,sha256=ZH6Q9oHZ9JHIt9Or2NCXm0cMee1CW9zxHWjiiswwoW8,50356
150
- modal_proto/modal_api_grpc.py,sha256=Jql4aM9MRTLfwwwsG2TyIXXbMbIeIKS4YhpXjsrL4ws,13354
145
+ modal_proto/api.proto,sha256=hc-xY5jmYeimEP0X-nKoiz8pZpMMKidUoNR2IOeebeI,77386
146
+ modal_proto/api_grpc.py,sha256=S7h8xe-msb3-Q8oSd7DUoB46z-dcRhsXGb6LjFCLNFI,99013
147
+ modal_proto/api_pb2.py,sha256=PLRmPloiKDiiziRzbZrzF3Cr-Cn5uCv9USwc7nC_eeg,282809
148
+ modal_proto/api_pb2.pyi,sha256=XHVPoCf60XtqCJrj7hIpu3d5ncdk3792ugyNq9XS-f4,378110
149
+ modal_proto/api_pb2_grpc.py,sha256=g7EfCSir3xStPPjJOU2U668zz6cGdN6u7SxvTTwU9aU,214126
150
+ modal_proto/api_pb2_grpc.pyi,sha256=9GhLZVRm69Qhyj_jmGqEGv1rD37Tzj6E6hGzKV08u48,49961
151
+ modal_proto/modal_api_grpc.py,sha256=en48QTR5fwA7x0twtlsqLKRjjDEAKVoh6EeSznQfQ3U,13236
151
152
  modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
152
153
  modal_proto/options.proto,sha256=a-siq4swVbZPfaFRXAipRZzGP2bq8OsdUvjlyzAeodQ,488
153
154
  modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
@@ -158,10 +159,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
158
159
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
160
  modal_version/__init__.py,sha256=UnAuHBPuPSstqgdCOx0SBVdfhpeJnMlY_oxEbu44Izg,470
160
161
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
161
- modal_version/_version_generated.py,sha256=lHCqMU3xSYZ4o9oCk-ECBCgaRLT_B_BQ_XLepv0xmRo,149
162
- modal-0.66.17.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
163
- modal-0.66.17.dist-info/METADATA,sha256=NNacGHoRPx4jXJLQV3xUksi9yETHblo9gMthc5NPf0s,2364
164
- modal-0.66.17.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
165
- modal-0.66.17.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
166
- modal-0.66.17.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
167
- modal-0.66.17.dist-info/RECORD,,
162
+ modal_version/_version_generated.py,sha256=K3KTopYH17C5MMGzy3fUGtpOXRNNR7V0OY19WIBopyw,149
163
+ modal-0.66.44.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
+ modal-0.66.44.dist-info/METADATA,sha256=YzAinNyCi4yGXbE_WKgrgchbMkTiWxI0ttvOlgIDkYE,2329
165
+ modal-0.66.44.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
166
+ modal-0.66.44.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
167
+ modal-0.66.44.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
168
+ modal-0.66.44.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -152,12 +152,6 @@ enum GPUType {
152
152
  GPU_TYPE_L40S = 11;
153
153
  }
154
154
 
155
- enum InstrumentationType {
156
- INSTRUMENTATION_TYPE_UNSPECIFIED = 0;
157
- INSTRUMENTATION_TYPE_METRICS = 1;
158
- INSTRUMENTATION_TYPE_TRACE = 2;
159
- }
160
-
161
155
  enum ObjectCreationType {
162
156
  OBJECT_CREATION_TYPE_UNSPECIFIED = 0; // just lookup
163
157
  OBJECT_CREATION_TYPE_CREATE_IF_MISSING = 1;
@@ -244,13 +238,6 @@ enum TaskState {
244
238
  TASK_STATE_LOADING_CHECKPOINT_IMAGE = 11;
245
239
  }
246
240
 
247
- // Encoding type used for user telemetry data.
248
- enum TelemetryEncodingType {
249
- TELEMETRY_ENCODING_TYPE_UNSPECIFIED = 0;
250
- TELEMETRY_ENCODING_TYPE_PROTOBUF = 1;
251
- TELEMETRY_ENCODING_TYPE_JSON = 2;
252
- }
253
-
254
241
  enum VolumeFsVersion {
255
242
  VOLUME_FS_VERSION_UNSPECIFIED = 0;
256
243
  VOLUME_FS_VERSION_V1 = 1;
@@ -1580,12 +1567,6 @@ message FunctionPutOutputsRequest {
1580
1567
  double requested_at = 5; // Used for waypoints.
1581
1568
  }
1582
1569
 
1583
- message FunctionPutUserTelemetryRequest {
1584
- bytes data = 1;
1585
- TelemetryEncodingType encoding_type = 2;
1586
- InstrumentationType instrumentation_type = 3;
1587
- }
1588
-
1589
1570
  message FunctionRetryInputsItem {
1590
1571
  string input_jwt = 1;
1591
1572
  FunctionInput input = 2;
@@ -1773,6 +1754,7 @@ message MethodDefinition {
1773
1754
  WebhookConfig webhook_config = 3;
1774
1755
  string web_url = 4;
1775
1756
  WebUrlInfo web_url_info = 5;
1757
+ repeated CustomDomainInfo custom_domain_info = 6;
1776
1758
  }
1777
1759
 
1778
1760
  message MountFile {
@@ -2101,6 +2083,8 @@ message Sandbox {
2101
2083
 
2102
2084
  // Network access configuration beyond simple allow/block.
2103
2085
  NetworkAccess network_access = 22;
2086
+
2087
+ optional string proxy_id = 23;
2104
2088
  }
2105
2089
 
2106
2090
  message SandboxCreateRequest {
@@ -2725,7 +2709,6 @@ service ModalClient {
2725
2709
  rpc FunctionPrecreate(FunctionPrecreateRequest) returns (FunctionPrecreateResponse);
2726
2710
  rpc FunctionPutInputs(FunctionPutInputsRequest) returns (FunctionPutInputsResponse);
2727
2711
  rpc FunctionPutOutputs(FunctionPutOutputsRequest) returns (google.protobuf.Empty); // For containers to return result
2728
- rpc FunctionPutUserTelemetry(FunctionPutUserTelemetryRequest) returns (google.protobuf.Empty);
2729
2712
  rpc FunctionRetryInputs(FunctionRetryInputsRequest) returns (FunctionRetryInputsResponse);
2730
2713
  rpc FunctionStartPtyShell(google.protobuf.Empty) returns (google.protobuf.Empty);
2731
2714
  rpc FunctionUpdateSchedulingParams(FunctionUpdateSchedulingParamsRequest) returns (FunctionUpdateSchedulingParamsResponse);
modal_proto/api_grpc.py CHANGED
@@ -285,10 +285,6 @@ class ModalClientBase(abc.ABC):
285
285
  async def FunctionPutOutputs(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.FunctionPutOutputsRequest, google.protobuf.empty_pb2.Empty]') -> None:
286
286
  pass
287
287
 
288
- @abc.abstractmethod
289
- async def FunctionPutUserTelemetry(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.FunctionPutUserTelemetryRequest, google.protobuf.empty_pb2.Empty]') -> None:
290
- pass
291
-
292
288
  @abc.abstractmethod
293
289
  async def FunctionRetryInputs(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.FunctionRetryInputsRequest, modal_proto.api_pb2.FunctionRetryInputsResponse]') -> None:
294
290
  pass
@@ -941,12 +937,6 @@ class ModalClientBase(abc.ABC):
941
937
  modal_proto.api_pb2.FunctionPutOutputsRequest,
942
938
  google.protobuf.empty_pb2.Empty,
943
939
  ),
944
- '/modal.client.ModalClient/FunctionPutUserTelemetry': grpclib.const.Handler(
945
- self.FunctionPutUserTelemetry,
946
- grpclib.const.Cardinality.UNARY_UNARY,
947
- modal_proto.api_pb2.FunctionPutUserTelemetryRequest,
948
- google.protobuf.empty_pb2.Empty,
949
- ),
950
940
  '/modal.client.ModalClient/FunctionRetryInputs': grpclib.const.Handler(
951
941
  self.FunctionRetryInputs,
952
942
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1727,12 +1717,6 @@ class ModalClientStub:
1727
1717
  modal_proto.api_pb2.FunctionPutOutputsRequest,
1728
1718
  google.protobuf.empty_pb2.Empty,
1729
1719
  )
1730
- self.FunctionPutUserTelemetry = grpclib.client.UnaryUnaryMethod(
1731
- channel,
1732
- '/modal.client.ModalClient/FunctionPutUserTelemetry',
1733
- modal_proto.api_pb2.FunctionPutUserTelemetryRequest,
1734
- google.protobuf.empty_pb2.Empty,
1735
- )
1736
1720
  self.FunctionRetryInputs = grpclib.client.UnaryUnaryMethod(
1737
1721
  channel,
1738
1722
  '/modal.client.ModalClient/FunctionRetryInputs',