modAL 1.4.1.dev3__py3-none-any.whl → 1.4.1.dev5__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.
@@ -2,6 +2,7 @@
2
2
  import asyncio
3
3
  import base64
4
4
  import json
5
+ import socket
5
6
  import ssl
6
7
  import time
7
8
  import urllib.parse
@@ -181,7 +182,10 @@ class TaskCommandRouterClient:
181
182
  closed_error_message="Unable to perform operation on a detached sandbox",
182
183
  )
183
184
 
184
- await _connect_channel(channel)
185
+ try:
186
+ await _connect_channel(channel)
187
+ except socket.gaierror as exc:
188
+ raise ConnectionError(f"Could not resolve hostname '{host}': {exc}") from exc
185
189
  loop = asyncio.get_running_loop()
186
190
  jwt_refresh_lock = asyncio.Lock()
187
191
 
modal/cli/import_refs.py CHANGED
@@ -127,6 +127,7 @@ class AutoRunPriority:
127
127
 
128
128
  def list_cli_commands(
129
129
  module_members: dict[str, typing.Any],
130
+ include_service_functions: bool = False,
130
131
  ) -> list[CLICommand]:
131
132
  """
132
133
  Extracts all runnables found either directly in the input module, or in any of the Apps listed in that module
@@ -149,8 +150,8 @@ def list_cli_commands(
149
150
  all_runnables[local_entrypoint].append(f"{app_name}.{name}")
150
151
  priorities[local_entrypoint] = AutoRunPriority.APP_LOCAL_ENTRYPOINT
151
152
  for name, function in app.registered_functions.items():
152
- if function.info.is_service_class():
153
- continue # Skip class and server service functions since they don't have associated cli commands
153
+ if function.info.is_service_class() and not include_service_functions:
154
+ continue # Skip class and server service functions for all commands except `modal shell`.
154
155
  all_runnables[function].append(f"{app_name}.{name}")
155
156
  priorities[function] = AutoRunPriority.APP_FUNCTION
156
157
  for cls_name, cls in app.registered_classes.items():
@@ -322,7 +323,12 @@ def _get_runnable_app(runnable: Runnable) -> App:
322
323
 
323
324
 
324
325
  def import_and_filter(
325
- import_ref: ImportRef, *, base_cmd: str, accept_local_entrypoint=True, accept_webhook=False
326
+ import_ref: ImportRef,
327
+ *,
328
+ base_cmd: str,
329
+ accept_local_entrypoint=True,
330
+ accept_webhook=False,
331
+ accept_service_functions=False,
326
332
  ) -> tuple[Optional[Runnable], list[CLICommand]]:
327
333
  """Takes a function ref string and returns a single determined "runnable" to use, and a list of all available
328
334
  runnables.
@@ -339,7 +345,10 @@ def import_and_filter(
339
345
  """
340
346
  # all commands:
341
347
  module = import_file_or_module(import_ref, base_cmd)
342
- cli_commands = list_cli_commands(dict(inspect.getmembers(module)))
348
+ cli_commands = list_cli_commands(
349
+ dict(inspect.getmembers(module)),
350
+ include_service_functions=accept_service_functions,
351
+ )
343
352
 
344
353
  # all commands that satisfy local entrypoint/accept webhook limitations AND object path prefix
345
354
 
modal/cli/shell.py CHANGED
@@ -142,7 +142,11 @@ def _start_shell_in_running_container(ref: str, cmd: str, pty: bool) -> None:
142
142
  def _function_spec_from_ref(ref: str, use_module_mode: bool) -> _FunctionSpec:
143
143
  import_ref = parse_import_ref(ref, use_module_mode=use_module_mode)
144
144
  runnable, all_usable_commands = import_and_filter(
145
- import_ref, base_cmd="modal shell", accept_local_entrypoint=False, accept_webhook=True
145
+ import_ref,
146
+ base_cmd="modal shell",
147
+ accept_local_entrypoint=False,
148
+ accept_webhook=True,
149
+ accept_service_functions=True,
146
150
  )
147
151
  if not runnable:
148
152
  help_header = (
modal/client.py CHANGED
@@ -56,8 +56,7 @@ def _get_metadata(client_type: int, credentials: Optional[tuple[str, str]], vers
56
56
  "x-modal-token-secret": token_secret,
57
57
  }
58
58
  )
59
- agent_env = _agent_environment()
60
- if agent_env:
59
+ if agent_env := _agent_environment():
61
60
  metadata["x-modal-agent-harness"] = urllib.parse.quote(agent_env)
62
61
  return metadata
63
62
 
modal/client.pyi CHANGED
@@ -35,7 +35,7 @@ class _Client:
35
35
  server_url: str,
36
36
  client_type: int,
37
37
  credentials: typing.Optional[tuple[str, str]],
38
- version: str = "1.4.1.dev3",
38
+ version: str = "1.4.1.dev5",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -171,7 +171,7 @@ class Client:
171
171
  server_url: str,
172
172
  client_type: int,
173
173
  credentials: typing.Optional[tuple[str, str]],
174
- version: str = "1.4.1.dev3",
174
+ version: str = "1.4.1.dev5",
175
175
  ):
176
176
  """mdmd:hidden
177
177
  The Modal client object is not intended to be instantiated directly by users.
modal/dict.py CHANGED
@@ -298,7 +298,8 @@ class _Dict(_Object, type_prefix="di"):
298
298
  )
299
299
 
300
300
  @classproperty
301
- def objects(cls) -> _DictManager:
301
+ @classmethod
302
+ def objects(cls) -> type[_DictManager]:
302
303
  return _DictManager
303
304
 
304
305
  @property
modal/dict.pyi CHANGED
@@ -412,7 +412,8 @@ class _Dict(modal._object._Object):
412
412
  ...
413
413
 
414
414
  @synchronicity.classproperty
415
- def objects(cls) -> _DictManager: ...
415
+ @classmethod
416
+ def objects(cls) -> type[_DictManager]: ...
416
417
  @property
417
418
  def name(self) -> typing.Optional[str]: ...
418
419
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
@@ -653,7 +654,8 @@ class Dict(modal.object.Object):
653
654
  ...
654
655
 
655
656
  @synchronicity.classproperty
656
- def objects(cls) -> DictManager: ...
657
+ @classmethod
658
+ def objects(cls) -> type[DictManager]: ...
657
659
  @property
658
660
  def name(self) -> typing.Optional[str]: ...
659
661
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
modal/queue.py CHANGED
@@ -291,7 +291,8 @@ class _Queue(_Object, type_prefix="qu"):
291
291
  raise RuntimeError("Queue() is not allowed. Please use `Queue.from_name(...)` or `Queue.ephemeral()` instead.")
292
292
 
293
293
  @classproperty
294
- def objects(cls) -> _QueueManager:
294
+ @classmethod
295
+ def objects(cls) -> type[_QueueManager]:
295
296
  return _QueueManager
296
297
 
297
298
  @property
modal/queue.pyi CHANGED
@@ -431,7 +431,8 @@ class _Queue(modal._object._Object):
431
431
  ...
432
432
 
433
433
  @synchronicity.classproperty
434
- def objects(cls) -> _QueueManager: ...
434
+ @classmethod
435
+ def objects(cls) -> type[_QueueManager]: ...
435
436
  @property
436
437
  def name(self) -> typing.Optional[str]: ...
437
438
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
@@ -726,7 +727,8 @@ class Queue(modal.object.Object):
726
727
  ...
727
728
 
728
729
  @synchronicity.classproperty
729
- def objects(cls) -> QueueManager: ...
730
+ @classmethod
731
+ def objects(cls) -> type[QueueManager]: ...
730
732
  @property
731
733
  def name(self) -> typing.Optional[str]: ...
732
734
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
modal/secret.py CHANGED
@@ -237,7 +237,8 @@ class _Secret(_Object, type_prefix="st"):
237
237
  _metadata: Optional[api_pb2.SecretMetadata] = None
238
238
 
239
239
  @classproperty
240
- def objects(cls) -> _SecretManager:
240
+ @classmethod
241
+ def objects(cls) -> type[_SecretManager]:
241
242
  return _SecretManager
242
243
 
243
244
  @property
modal/secret.pyi CHANGED
@@ -375,7 +375,8 @@ class _Secret(modal._object._Object):
375
375
  _metadata: typing.Optional[modal_proto.api_pb2.SecretMetadata]
376
376
 
377
377
  @synchronicity.classproperty
378
- def objects(cls) -> _SecretManager: ...
378
+ @classmethod
379
+ def objects(cls) -> type[_SecretManager]: ...
379
380
  @property
380
381
  def name(self) -> typing.Optional[str]: ...
381
382
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
@@ -500,7 +501,8 @@ class Secret(modal.object.Object):
500
501
  ...
501
502
 
502
503
  @synchronicity.classproperty
503
- def objects(cls) -> SecretManager: ...
504
+ @classmethod
505
+ def objects(cls) -> type[SecretManager]: ...
504
506
  @property
505
507
  def name(self) -> typing.Optional[str]: ...
506
508
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
modal/volume.py CHANGED
@@ -358,7 +358,8 @@ class _Volume(_Object, type_prefix="vo"):
358
358
  _read_only: bool = False
359
359
 
360
360
  @classproperty
361
- def objects(cls) -> _VolumeManager:
361
+ @classmethod
362
+ def objects(cls) -> type[_VolumeManager]:
362
363
  return _VolumeManager
363
364
 
364
365
  @property
modal/volume.pyi CHANGED
@@ -454,7 +454,8 @@ class _Volume(modal._object._Object):
454
454
  _read_only: bool
455
455
 
456
456
  @synchronicity.classproperty
457
- def objects(cls) -> _VolumeManager: ...
457
+ @classmethod
458
+ def objects(cls) -> type[_VolumeManager]: ...
458
459
  @property
459
460
  def name(self) -> typing.Optional[str]: ...
460
461
  def read_only(self) -> _Volume:
@@ -789,7 +790,8 @@ class Volume(modal.object.Object):
789
790
  ...
790
791
 
791
792
  @synchronicity.classproperty
792
- def objects(cls) -> VolumeManager: ...
793
+ @classmethod
794
+ def objects(cls) -> type[VolumeManager]: ...
793
795
  @property
794
796
  def name(self) -> typing.Optional[str]: ...
795
797
  def read_only(self) -> Volume:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.1.dev3
3
+ Version: 1.4.1.dev5
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -23,7 +23,7 @@ Requires-Dist: grpclib<0.4.10,>=0.4.7; python_version < "3.14"
23
23
  Requires-Dist: grpclib<0.4.10,>=0.4.9; python_version >= "3.14"
24
24
  Requires-Dist: protobuf!=4.24.0,<7.0,>=3.19
25
25
  Requires-Dist: rich>=12.0.0
26
- Requires-Dist: synchronicity~=0.11.1
26
+ Requires-Dist: synchronicity~=0.12.0
27
27
  Requires-Dist: toml
28
28
  Requires-Dist: typer>=0.9
29
29
  Requires-Dist: types-certifi
@@ -25,8 +25,8 @@ modal/app.py,sha256=-gswV67eBOexKzJly7Nfr5eoQOzciPFMwnnawf4RIHs,62860
25
25
  modal/app.pyi,sha256=vU6tli-ELcF3do5sCF-Wch1gFRP3xjPLoq112SCq_z8,54009
26
26
  modal/billing.py,sha256=B2zXa7KeMnpqi2AQINycEk-KSXVYaLTTTAQTtuf2Gfs,257
27
27
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
28
- modal/client.py,sha256=Vk84hG9pPiHmuONEn0rsFm8AWag_KbA29lZR1Mqh8ZU,15011
29
- modal/client.pyi,sha256=V1qoxW9-PcDIgRw3G6v2Vk4nMronanKWmOrknI6OXeU,14930
28
+ modal/client.py,sha256=yxMDF2vQZAwgYCatTem1lyRLS90u9T0BFnHBUAg1XU0,14998
29
+ modal/client.pyi,sha256=-xKqsfLxpU8u6xrUzMLgvDtYBu4HQ0BNASPJaUfqV3o,14930
30
30
  modal/cloud_bucket_mount.py,sha256=KkaJVy5vpO_u2NtDYtv1JM-M3y4J0UtWBapTDKpQRcA,6034
31
31
  modal/cloud_bucket_mount.pyi,sha256=mGDeEd1XvxGpCE6O5jRBSfIvMXvZ5AtIybea5k-0w9w,7560
32
32
  modal/cls.py,sha256=Yrl5b_tQhZMhc5avInM-i5UlGuqeog6Gs4rX2d9lLjI,40390
@@ -34,8 +34,8 @@ modal/cls.pyi,sha256=xnSZWumIjAGNM0c20bKsMqG-9hdvPp9uApfFDivSKsU,24910
34
34
  modal/config.py,sha256=nnvPX37opsIF8wO8cixUBSd3cLJtgTz_FOXBjyPxbyM,14330
35
35
  modal/container_process.py,sha256=EMwQ0gHWD9HqMjbW_yna7hsqYNxweP8ZcxlUXzfORyA,16781
36
36
  modal/container_process.pyi,sha256=jyV3WIkTn2NsXqAFf5Jseciz2mdq_sjO9zQMoJnquIg,8211
37
- modal/dict.py,sha256=doH9T83sZf3Ho2wL8pHqNbGwkTFMV4gz5E9u5g93IMs,23217
38
- modal/dict.pyi,sha256=A2R_45DwDQEFJRYLf0dd7i41UMWtnjd79d_sgFswCkw,33832
37
+ modal/dict.py,sha256=_N4glRNKlm9DM5cONV_hRKk1GvIGzBR1BJ-KicBJnlo,23240
38
+ modal/dict.pyi,sha256=9JGE-90THghjmc1Mw6bkdpEyVrXH-YuyAThEDGVrqUA,33878
39
39
  modal/environments.py,sha256=wMiMNpPkvIl_BdxRb81CY9Djzhczp_y4GEYKWp0JyBc,6135
40
40
  modal/environments.pyi,sha256=bMIxvwahckgaolGD3-hP2iovRHDXewvgbVs_nx4ze0o,3808
41
41
  modal/exception.py,sha256=AMvcFzlJxiFqaYe2An7fNgC4_2VFLUoNUDxr6ODwVkU,11447
@@ -62,8 +62,8 @@ modal/partial_function.pyi,sha256=gnK1pmA91_SYwiRKVWQl_H2fRZ4wfds6ig_apDPnXsw,12
62
62
  modal/proxy.py,sha256=zIe_ZMAeRu9dgU9FKwZqpvCFTNwLLwIC0Vra4ZZfz1I,1737
63
63
  modal/proxy.pyi,sha256=05HihJqRRJydYQSjLMYs9-mxdvzq4OUpKg3PAfrBppo,1597
64
64
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- modal/queue.py,sha256=DWMHBFz_pE1AKFLdUZVKCMrwAHKyFk92vtUCQGbYrcw,27240
66
- modal/queue.pyi,sha256=9DfLG5TExqiOo_hRKdVncIXSWMLTIB-AUpvDMpb4qyw,40228
65
+ modal/queue.py,sha256=yJiCdetI34lklRLmVpK_bZVP52iDGbUVMbtLwSqeWmg,27263
66
+ modal/queue.pyi,sha256=Yb1U8VC0xop6SHGVrc1qpLjeLZY7y1yzy1UNjkS5GKg,40274
67
67
  modal/retries.py,sha256=vPWWKP-FRolJwTBuLPXdWqHV7aJfSQFgEW7vhlBBXRQ,5067
68
68
  modal/runner.py,sha256=yIB1PE5EGdvLWPPymyT4P0KYliREnFf-MAtULl3tVN0,30062
69
69
  modal/runner.pyi,sha256=ySefjmlMQ5FsvJgJkCWiUZKvcPNfEqdB5hwxI1fGtDo,9445
@@ -74,8 +74,8 @@ modal/sandbox_fs.py,sha256=mEgfFKGgLFO7Ncvw_iQc54htHZ66E1i56ADNnXj9NHQ,13080
74
74
  modal/sandbox_fs.pyi,sha256=qr3PWlWwHqKRa_fPe9aI2ecj-iNF-NKY52GaL_MXc1U,21245
75
75
  modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
76
76
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
77
- modal/secret.py,sha256=LAIPDszQB4a2WgWL_6NTZlOMrBa548_9w-A02TZ88qA,18648
78
- modal/secret.pyi,sha256=Q4PI-IvEZiR9_iI6F3sWsk7DRt-fj5hybTyeCmS5fnc,21517
77
+ modal/secret.py,sha256=vPwpS_toTsDNq3qZ87Rlqb0g6JvU2qYEjENJHDXPXto,18671
78
+ modal/secret.pyi,sha256=epfG1sN9fvaGgC7PpemecJHE3yMaTqFU5HbsdJBFul0,21563
79
79
  modal/server.py,sha256=zWoDdtwCEKsKbFfWC4l7-NkpnJJybweC284VIoCavrI,164
80
80
  modal/server.pyi,sha256=d_boB2FhK2b3C_G7YPM9oeWlCWEZhBCxbeebAKcrY-Q,5242
81
81
  modal/serving.py,sha256=akauomk_rQNabYKXhgp6SGxBU4cFontanDqMfAkk7Ng,4188
@@ -85,8 +85,8 @@ modal/snapshot.pyi,sha256=vMYDx1s9Ds4qtH-PXgB_9RzVuS5wsTchVcclR5Q-mmM,2014
85
85
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
86
86
  modal/token_flow.py,sha256=muvMsYAcLB2X1s61K-ChGNnu-vPpQUW1N8IYOrA8eho,7036
87
87
  modal/token_flow.pyi,sha256=5zdXJ5SLLHM4j6xSPuEvnpSeEJBbzE6NkSX-MSyE5wM,2282
88
- modal/volume.py,sha256=68jYyn4lJ9gD6Dxzzy0dsw_2ghzfjJhWmwZW3gcS-Og,55493
89
- modal/volume.pyi,sha256=ox0NWb-C5XyjUtdvoICuIogk3DA6jsbDIrn6gN78teY,55886
88
+ modal/volume.py,sha256=YXiutZaltoEeYwpq346BLpTeLjmoobIRm09qEFIVJhk,55516
89
+ modal/volume.pyi,sha256=KgG6_T56RQEdroh6TmooGtZXcd_HNVWUaxAky04GOG0,55932
90
90
  modal/_output/__init__.py,sha256=xtGN6SPv2zvByrJ32JPao0yJKpxyCIZ-2JMTScrisuQ,28
91
91
  modal/_output/manager.py,sha256=8JGUm8S1PfiibvyI1t_pcniktZbe8KAV1TvLtoZ80rk,18161
92
92
  modal/_output/pty.py,sha256=wniYe_MW9_pEhCjDgRyrruYJNNtZoAJ0MuOOl3UrGI0,10174
@@ -126,7 +126,7 @@ modal/_utils/pattern_utils.py,sha256=ZUffaECfe2iYBhH6cvCB-0-UWhmEBTZEl_TwG_So3ag
126
126
  modal/_utils/rand_pb_testing.py,sha256=oNtQB1BY9CDh7vDXEkJitCuCu9a2ufk0KRcEuZ15d0k,4229
127
127
  modal/_utils/sandbox_fs_utils.py,sha256=n0YWapQJ4HcjifNz9FHa7NGsisXcS14f_AMjZRQ8LyE,7060
128
128
  modal/_utils/shell_utils.py,sha256=GjMrO1YxnBr4_UlpA2ZYQKCHxV78QTg0mqxAMHWGTE4,3427
129
- modal/_utils/task_command_router_client.py,sha256=Sm624zQ3URTVImlPKHgBYRzhevFCOiVvW3yjXgMlJX8,25889
129
+ modal/_utils/task_command_router_client.py,sha256=PFGwH7sFpdOJ9g50JNGGeldlzWWfg4eIpi_22tsV-rs,26049
130
130
  modal/_utils/time_utils.py,sha256=VVrIwm7YMv2vMznNGknkGzyATDp5iJ29F_7NZPfm5b0,7062
131
131
  modal/_vendor/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
132
132
  modal/_vendor/a2wsgi_wsgi.py,sha256=Q1AsjpV_Q_vzQsz_cSqmP9jWzsGsB-ARFU6vpQYml8k,21878
@@ -154,7 +154,7 @@ modal/cli/dashboard.py,sha256=MJdbZq1duj97Hu3p9NNLrPogC1Wm2wL3dmCjBUgrMtU,862
154
154
  modal/cli/dict.py,sha256=uRny4LtN7ej7ONir1cpSLGAC-gvZrIGO8bftbCeK0VE,4743
155
155
  modal/cli/entry_point.py,sha256=6NXIo2JzzQD7yZ57M6Y5KvL8QnYYGp0_T7YucOeqFQA,6262
156
156
  modal/cli/environment.py,sha256=AKgtjzFkTxAOlWAZC6uHsZro_y2jfeugL0r8bXHw4Ic,3904
157
- modal/cli/import_refs.py,sha256=gOO8kGuyAbkItvYaT8IdqszSw4miRxlD3T7jm97waEk,13938
157
+ modal/cli/import_refs.py,sha256=_UkSOnrWERQU_uBjRQqpUMYby5yWQnwWS6zAj_YOSWQ,14138
158
158
  modal/cli/launch.py,sha256=88KAgzes2-gI-JgsDsditEPvwLPHhrfck3-z1Zhij-c,3738
159
159
  modal/cli/network_file_system.py,sha256=X8nkRfoi88_ItdMqMDHvcbhJkWfIJeaZwkMa3N-O-I0,7302
160
160
  modal/cli/profile.py,sha256=w_LAbu6BvDU5U6Bm3yFaZydKCMdurGpdjCdsSkKbu8s,3259
@@ -162,7 +162,7 @@ modal/cli/queues.py,sha256=0sl1aydtudoH9RYLyUAK7FJSJ8oCtgYkkENQJ_7ifXc,6230
162
162
  modal/cli/run.py,sha256=qCeJZpEt2iiHofrYbzI-fadXr_8LOwfBZeCR8GLRQoI,21453
163
163
  modal/cli/secret.py,sha256=yBpjzzkbA2dNb_Q_2qqltMvCfhzUxDH7-xehLiqrvhI,8061
164
164
  modal/cli/selector.py,sha256=2P4fAgvntNLBJaMjZdDHHopCSoefHKpCMfKGzXzk9jc,4178
165
- modal/cli/shell.py,sha256=oJT5U7ZTW7KJZ2cFl44su_zrbsvaPJKWAWvwuCEX3CQ,14663
165
+ modal/cli/shell.py,sha256=v0JgGXUousN2LkY6zEGO5zDlU82VuiyS5B0MILJTkFw,14727
166
166
  modal/cli/token.py,sha256=KIEOgHJ-k1t2h6tolBmQJSSOJlpU3kvmH_IKQzaHhig,4098
167
167
  modal/cli/utils.py,sha256=aLTpttgH2lkOAC6HRtaAMCIKgo-zluvC_d-yQ3gsrz4,6462
168
168
  modal/cli/volume.py,sha256=Tp97ekMTEHT0NXwgyEudO8yIZ75OGOfjIfH44WS5r9Y,11026
@@ -173,7 +173,7 @@ modal/experimental/__init__.py,sha256=Wb1YoAKAnNxH_0c2wA0T12I7bSu9PSO2nS_LuLska7
173
173
  modal/experimental/flash.py,sha256=ATGhVO8AleJ-TOe2PGolI5T7zfCEtj0kl_ivMPp7Rqg,33362
174
174
  modal/experimental/flash.pyi,sha256=R4h2nQl7-oiwqq_twCp0YqID_LnPjPGqxywXvxbiLIk,17011
175
175
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
176
- modal-1.4.1.dev3.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
176
+ modal-1.4.1.dev5.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
177
177
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
178
178
  modal_docs/gen_cli_docs.py,sha256=5sVABw4uGUqPXjcWT0Nqjkpe5KLs89C3tFnla58-D0M,3756
179
179
  modal_docs/gen_cli_docs_main.py,sha256=UPGr7O1DYTIRLwfINe2rbdh89J3cPVTU1OWL-SjxnOQ,198
@@ -183,22 +183,22 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
183
183
  modal_docs/mdmd/mdmd.py,sha256=fNMtrFy0Z7KMXysr9v0w9H0OOuRVBW4-sqJu1pvRQm4,9583
184
184
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
185
185
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
186
- modal_proto/api_grpc.py,sha256=rTv9MyBCWKTEbPEXk4h5sFoCbjrCTg0Gcwqc69gr2Ns,146012
187
- modal_proto/api_pb2.py,sha256=bXZh5CrAOJ4sxNzrvXbU87Oirmeh2UCcjgCLwTf4R5M,406482
188
- modal_proto/api_pb2.pyi,sha256=HsusJF-hH3S89Xa0GDOVWnoo-oC8J34Behfj4NDsYOE,571974
189
- modal_proto/api_pb2_grpc.py,sha256=nZWyLmjNkwq3H33-HWmARRLqfJ7Zgdr0ou7lYnRu2jg,314684
190
- modal_proto/api_pb2_grpc.pyi,sha256=safA3cDMsiSgIO6ig_x7tRkfqq3fKM2Apqsm6WbHnw4,73447
191
- modal_proto/modal_api_grpc.py,sha256=O743nwd1Li6I8Bz0qsJEtujl2tocgSEW70HY1N6n9VY,23061
186
+ modal_proto/api_grpc.py,sha256=EoxRUVTJGfr4_Pvl_KuS6qlIpSMIjdgUZlVS2A5f-fw,146945
187
+ modal_proto/api_pb2.py,sha256=QbOc3SZZxqarOOCyJ8bt22ccSZiPxZzD9wdfIJPo3JY,408118
188
+ modal_proto/api_pb2.pyi,sha256=MUv1srihwt85CkCVv9o8uUtndKM3eU-y3kMnXuMNSDo,573206
189
+ modal_proto/api_pb2_grpc.py,sha256=yUUClQ31aaBf8W3ATslBn8Pkfv7XEoZv5acKRGUof0U,316538
190
+ modal_proto/api_pb2_grpc.pyi,sha256=cHsD_Lj3HiL-GjrjTL1EGtz5CIaxhOqZeRdy0BHYM1E,73914
191
+ modal_proto/modal_api_grpc.py,sha256=8JcM7CJ7_yE2HXX2K_wwBoT5YlVfuA2hv_wbSonm6us,23207
192
192
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
193
  modal_proto/task_command_router_grpc.py,sha256=wdRwQ0BaEWRDXxWlvbQG9eUDeTgAM_Wu99d8xzMv8HA,11703
194
- modal_proto/task_command_router_pb2.py,sha256=uSSR8Y9Yp07cIL60ds7__wUr5rj1uL2CQYQlm7b4Hqs,22623
195
- modal_proto/task_command_router_pb2.pyi,sha256=utNwipYgMZUEUuWBE7sJ5cNjRctozHKPKDRpLy6cPLM,25667
194
+ modal_proto/task_command_router_pb2.py,sha256=EHjVM4Q-RDoXyJQ2VjFv6FmSXSFPWPYwl1zALW0Spyk,23504
195
+ modal_proto/task_command_router_pb2.pyi,sha256=yxufDIGZpoTlIBiKH2HPgrq0WTUmxq2kaJE3wGcgjT4,26498
196
196
  modal_proto/task_command_router_pb2_grpc.py,sha256=YoinPeLc-uwFShig8gE0MluOi6n-qqJZQ3YvnKwKUz8,23194
197
197
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=VUSE5l1O6ATPT8Wbj4M3faMiIy5vFxSoS5ZlKfTEpHc,7449
198
- modal_version/__init__.py,sha256=RI5cimNviOYYQcyWHVLAGZzn2VvEwcGwyN2PbVtWqBs,120
198
+ modal_version/__init__.py,sha256=Akj2bIyT5kPJCeyKDETecQ1GaAk7_dXohbKrNEoeSzA,120
199
199
  modal_version/__main__.py,sha256=nLUbubxKx7GXNzJIkTB7M7_u8080LyLM0IS0rzFkC_c,119
200
- modal-1.4.1.dev3.dist-info/METADATA,sha256=n6zgKBkDmk7Vc4i6vrgXe9h5PGcnisoyfwtkn_t2dr8,2364
201
- modal-1.4.1.dev3.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
202
- modal-1.4.1.dev3.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
203
- modal-1.4.1.dev3.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
204
- modal-1.4.1.dev3.dist-info/RECORD,,
200
+ modal-1.4.1.dev5.dist-info/METADATA,sha256=zDMtcUNGeF3L3B5lSlOAQqKyuxlfPajA-s_ifnRXe9s,2364
201
+ modal-1.4.1.dev5.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
202
+ modal-1.4.1.dev5.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
203
+ modal-1.4.1.dev5.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
204
+ modal-1.4.1.dev5.dist-info/RECORD,,
modal_proto/api_grpc.py CHANGED
@@ -503,6 +503,10 @@ class ModalClientBase(abc.ABC):
503
503
  async def SandboxCreateV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxCreateV2Request, modal_proto.api_pb2.SandboxCreateV2Response]') -> None:
504
504
  pass
505
505
 
506
+ @abc.abstractmethod
507
+ async def SandboxGetCommandRouterAccess(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest, modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse]') -> None:
508
+ pass
509
+
506
510
  @abc.abstractmethod
507
511
  async def SandboxGetFromName(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetFromNameRequest, modal_proto.api_pb2.SandboxGetFromNameResponse]') -> None:
508
512
  pass
@@ -1503,6 +1507,12 @@ class ModalClientBase(abc.ABC):
1503
1507
  modal_proto.api_pb2.SandboxCreateV2Request,
1504
1508
  modal_proto.api_pb2.SandboxCreateV2Response,
1505
1509
  ),
1510
+ '/modal.client.ModalClient/SandboxGetCommandRouterAccess': grpclib.const.Handler(
1511
+ self.SandboxGetCommandRouterAccess,
1512
+ grpclib.const.Cardinality.UNARY_UNARY,
1513
+ modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest,
1514
+ modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse,
1515
+ ),
1506
1516
  '/modal.client.ModalClient/SandboxGetFromName': grpclib.const.Handler(
1507
1517
  self.SandboxGetFromName,
1508
1518
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2643,6 +2653,12 @@ class ModalClientStub:
2643
2653
  modal_proto.api_pb2.SandboxCreateV2Request,
2644
2654
  modal_proto.api_pb2.SandboxCreateV2Response,
2645
2655
  )
2656
+ self.SandboxGetCommandRouterAccess = grpclib.client.UnaryUnaryMethod(
2657
+ channel,
2658
+ '/modal.client.ModalClient/SandboxGetCommandRouterAccess',
2659
+ modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest,
2660
+ modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse,
2661
+ )
2646
2662
  self.SandboxGetFromName = grpclib.client.UnaryUnaryMethod(
2647
2663
  channel,
2648
2664
  '/modal.client.ModalClient/SandboxGetFromName',