modal 0.74.17__py3-none-any.whl → 0.74.19__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.
- modal/_runtime/container_io_manager.py +26 -10
- modal/app.py +73 -11
- modal/app.pyi +28 -0
- modal/cli/run.py +11 -2
- modal/client.pyi +2 -2
- modal/runner.py +11 -24
- {modal-0.74.17.dist-info → modal-0.74.19.dist-info}/METADATA +1 -1
- {modal-0.74.17.dist-info → modal-0.74.19.dist-info}/RECORD +14 -14
- modal_docs/gen_reference_docs.py +0 -1
- modal_version/_version_generated.py +1 -1
- {modal-0.74.17.dist-info → modal-0.74.19.dist-info}/WHEEL +0 -0
- {modal-0.74.17.dist-info → modal-0.74.19.dist-info}/entry_points.txt +0 -0
- {modal-0.74.17.dist-info → modal-0.74.19.dist-info}/licenses/LICENSE +0 -0
- {modal-0.74.17.dist-info → modal-0.74.19.dist-info}/top_level.txt +0 -0
@@ -352,15 +352,19 @@ class _ContainerIOManager:
|
|
352
352
|
await self._client.stub.ContainerHello(Empty())
|
353
353
|
|
354
354
|
async def _run_heartbeat_loop(self):
|
355
|
+
t_last_success = time.monotonic()
|
355
356
|
while 1:
|
356
357
|
t0 = time.monotonic()
|
357
358
|
try:
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
#
|
362
|
-
#
|
363
|
-
#
|
359
|
+
got_cancellation = await self._heartbeat_handle_cancellations()
|
360
|
+
t_last_success = time.monotonic()
|
361
|
+
if got_cancellation:
|
362
|
+
# Got a cancellation event, so it is fine to start another heartbeat immediately
|
363
|
+
# since the cancellation queue should be empty on the worker server.
|
364
|
+
# However, we wait at least 1s to prevent short-circuiting the heartbeat loop
|
365
|
+
# in case there is ever a bug.
|
366
|
+
# This means it will take at least 1s between two subsequent cancellations on the
|
367
|
+
# same task at the moment.
|
364
368
|
await asyncio.sleep(1.0)
|
365
369
|
continue
|
366
370
|
except ClientClosed:
|
@@ -368,13 +372,25 @@ class _ContainerIOManager:
|
|
368
372
|
break
|
369
373
|
except Exception as exc:
|
370
374
|
# don't stop heartbeat loop if there are transient exceptions!
|
371
|
-
|
375
|
+
attempt_dur = time.monotonic() - t0
|
376
|
+
time_since_heartbeat_success = time.monotonic() - t_last_success
|
372
377
|
error = exc
|
373
|
-
logger.warning(
|
378
|
+
logger.warning(
|
379
|
+
f"Modal Client → Modal Worker Heartbeat attempt failed "
|
380
|
+
f"({attempt_dur=:.2f}, {time_since_heartbeat_success=:.2f}, {error=})"
|
381
|
+
)
|
382
|
+
if time_since_heartbeat_success > HEARTBEAT_INTERVAL * 50:
|
383
|
+
trouble_mins = time_since_heartbeat_success / 60
|
384
|
+
logger.warning(
|
385
|
+
"Modal Client → Modal Worker heartbeat attempts have been failing for "
|
386
|
+
f"over {trouble_mins:.2f} minutes. "
|
387
|
+
"Container will eventually be marked unhealthy. "
|
388
|
+
"See https://modal.com/docs/guide/troubleshooting#heartbeat-timeout. "
|
389
|
+
)
|
374
390
|
|
375
391
|
heartbeat_duration = time.monotonic() - t0
|
376
|
-
|
377
|
-
await asyncio.sleep(
|
392
|
+
time_until_next_heartbeat = max(0.0, HEARTBEAT_INTERVAL - heartbeat_duration)
|
393
|
+
await asyncio.sleep(time_until_next_heartbeat)
|
378
394
|
|
379
395
|
async def _heartbeat_handle_cancellations(self) -> bool:
|
380
396
|
# Return True if a cancellation event was received, in that case
|
modal/app.py
CHANGED
@@ -333,11 +333,11 @@ class _App:
|
|
333
333
|
interactive: bool = False,
|
334
334
|
environment_name: Optional[str] = None,
|
335
335
|
) -> AsyncGenerator["_App", None]:
|
336
|
-
"""Context manager that runs an app on Modal.
|
336
|
+
"""Context manager that runs an ephemeral app on Modal.
|
337
337
|
|
338
338
|
Use this as the main entry point for your Modal application. All calls
|
339
|
-
to Modal
|
340
|
-
manager, and they will correspond to the current
|
339
|
+
to Modal Functions should be made within the scope of this context
|
340
|
+
manager, and they will correspond to the current App.
|
341
341
|
|
342
342
|
**Example**
|
343
343
|
|
@@ -346,7 +346,7 @@ class _App:
|
|
346
346
|
some_modal_function.remote()
|
347
347
|
```
|
348
348
|
|
349
|
-
To enable output printing, use `modal.enable_output()`:
|
349
|
+
To enable output printing (i.e., to see App logs), use `modal.enable_output()`:
|
350
350
|
|
351
351
|
```python notest
|
352
352
|
with modal.enable_output():
|
@@ -354,10 +354,10 @@ class _App:
|
|
354
354
|
some_modal_function.remote()
|
355
355
|
```
|
356
356
|
|
357
|
-
Note that you
|
358
|
-
Modal
|
359
|
-
or
|
360
|
-
|
357
|
+
Note that you should not invoke this in global scope of a file where you have
|
358
|
+
Modal Functions or Classes defined, since that would run the block when the Function
|
359
|
+
or Cls is imported in your containers as well. If you want to run it as your entrypoint,
|
360
|
+
consider protecting it:
|
361
361
|
|
362
362
|
```python
|
363
363
|
if __name__ == "__main__":
|
@@ -371,9 +371,6 @@ class _App:
|
|
371
371
|
python app_module.py
|
372
372
|
```
|
373
373
|
|
374
|
-
Note that this method used to return a separate "App" object. This is
|
375
|
-
no longer useful since you can use the app itself for access to all
|
376
|
-
objects. For backwards compatibility reasons, it returns the same app.
|
377
374
|
"""
|
378
375
|
from .runner import _run_app # Defer import of runner.py, which imports a lot from Rich
|
379
376
|
|
@@ -392,6 +389,71 @@ class _App:
|
|
392
389
|
):
|
393
390
|
yield self
|
394
391
|
|
392
|
+
async def deploy(
|
393
|
+
self,
|
394
|
+
*,
|
395
|
+
name: Optional[str] = None, # Name for the deployment, overriding any set on the App
|
396
|
+
environment_name: Optional[str] = None, # Environment to deploy the App in
|
397
|
+
tag: str = "", # Optional metadata that will be visible in the deployment history
|
398
|
+
client: Optional[_Client] = None, # Alternate client to use for RPCs
|
399
|
+
) -> typing_extensions.Self:
|
400
|
+
"""Deploy the App so that it is available persistently.
|
401
|
+
|
402
|
+
Deployed Apps will be avaible for lookup or web-based invocations until they are stopped.
|
403
|
+
Unlike with `App.run`, this method will return as soon as the deployment completes.
|
404
|
+
|
405
|
+
This method is a programmatic alternative to the `modal deploy` CLI command.
|
406
|
+
|
407
|
+
Examples:
|
408
|
+
|
409
|
+
```python notest
|
410
|
+
app = App("my-app")
|
411
|
+
app.deploy()
|
412
|
+
```
|
413
|
+
|
414
|
+
To enable output printing (i.e., to see build logs), use `modal.enable_output()`:
|
415
|
+
|
416
|
+
```python notest
|
417
|
+
app = App("my-app")
|
418
|
+
with modal.enable_output():
|
419
|
+
app.deploy()
|
420
|
+
```
|
421
|
+
|
422
|
+
Unlike with `App.run`, Function logs will not stream back to the local client after the
|
423
|
+
App is deployed.
|
424
|
+
|
425
|
+
Note that you should not invoke this method in global scope, as that would redeploy
|
426
|
+
the App every time the file is imported. If you want to write a programmatic deployment
|
427
|
+
script, protect this call so that it only runs when the file is executed directly:
|
428
|
+
|
429
|
+
```python notest
|
430
|
+
if __name__ == "__main__":
|
431
|
+
with modal.enable_output():
|
432
|
+
app.deploy()
|
433
|
+
```
|
434
|
+
|
435
|
+
Then you can deploy your app with:
|
436
|
+
|
437
|
+
```shell
|
438
|
+
python app_module.py
|
439
|
+
```
|
440
|
+
|
441
|
+
"""
|
442
|
+
from .runner import _deploy_app # Defer import of runner.py, which imports a lot from Rich
|
443
|
+
|
444
|
+
if name is None and self._name is None:
|
445
|
+
raise InvalidError(
|
446
|
+
"You need to either supply a deployment name or have a name set on the app.\n"
|
447
|
+
"\n"
|
448
|
+
"Examples:\n"
|
449
|
+
'app.deploy(name="some-name")\n\n'
|
450
|
+
"or\n"
|
451
|
+
'app = modal.App("some-name")'
|
452
|
+
)
|
453
|
+
result = await _deploy_app(self, name=name, environment_name=environment_name, tag=tag, client=client)
|
454
|
+
self._app_id = result.app_id
|
455
|
+
return self
|
456
|
+
|
395
457
|
def _get_default_image(self):
|
396
458
|
if self._image:
|
397
459
|
return self._image
|
modal/app.pyi
CHANGED
@@ -137,6 +137,14 @@ class _App:
|
|
137
137
|
interactive: bool = False,
|
138
138
|
environment_name: typing.Optional[str] = None,
|
139
139
|
) -> typing.AsyncContextManager[_App]: ...
|
140
|
+
async def deploy(
|
141
|
+
self,
|
142
|
+
*,
|
143
|
+
name: typing.Optional[str] = None,
|
144
|
+
environment_name: typing.Optional[str] = None,
|
145
|
+
tag: str = "",
|
146
|
+
client: typing.Optional[modal.client._Client] = None,
|
147
|
+
) -> typing_extensions.Self: ...
|
140
148
|
def _get_default_image(self): ...
|
141
149
|
def _get_watch_mounts(self): ...
|
142
150
|
def _add_function(self, function: modal._functions._Function, is_web_endpoint: bool): ...
|
@@ -379,6 +387,26 @@ class App:
|
|
379
387
|
|
380
388
|
run: __run_spec[typing_extensions.Self]
|
381
389
|
|
390
|
+
class __deploy_spec(typing_extensions.Protocol[SUPERSELF]):
|
391
|
+
def __call__(
|
392
|
+
self,
|
393
|
+
*,
|
394
|
+
name: typing.Optional[str] = None,
|
395
|
+
environment_name: typing.Optional[str] = None,
|
396
|
+
tag: str = "",
|
397
|
+
client: typing.Optional[modal.client.Client] = None,
|
398
|
+
) -> SUPERSELF: ...
|
399
|
+
async def aio(
|
400
|
+
self,
|
401
|
+
*,
|
402
|
+
name: typing.Optional[str] = None,
|
403
|
+
environment_name: typing.Optional[str] = None,
|
404
|
+
tag: str = "",
|
405
|
+
client: typing.Optional[modal.client.Client] = None,
|
406
|
+
) -> SUPERSELF: ...
|
407
|
+
|
408
|
+
deploy: __deploy_spec[typing_extensions.Self]
|
409
|
+
|
382
410
|
def _get_default_image(self): ...
|
383
411
|
def _get_watch_mounts(self): ...
|
384
412
|
def _add_function(self, function: modal.functions.Function, is_web_endpoint: bool): ...
|
modal/cli/run.py
CHANGED
@@ -444,8 +444,17 @@ def deploy(
|
|
444
444
|
import_ref = parse_import_ref(app_ref, use_module_mode=use_module_mode)
|
445
445
|
app = import_app_from_ref(import_ref, base_cmd="modal deploy")
|
446
446
|
|
447
|
-
|
448
|
-
|
447
|
+
name = name or app.name or ""
|
448
|
+
if not name:
|
449
|
+
raise ExecutionError(
|
450
|
+
"You need to either supply an explicit deployment name on the command line "
|
451
|
+
"or have a name set on the app.\n"
|
452
|
+
"\n"
|
453
|
+
"Examples:\n"
|
454
|
+
'app = modal.App("some-name")'
|
455
|
+
"or\n"
|
456
|
+
"modal deploy ... --name=some-name"
|
457
|
+
)
|
449
458
|
|
450
459
|
with enable_output():
|
451
460
|
res = deploy_app(app, name=name, environment_name=env or "", tag=tag)
|
modal/client.pyi
CHANGED
@@ -27,7 +27,7 @@ class _Client:
|
|
27
27
|
_snapshotted: bool
|
28
28
|
|
29
29
|
def __init__(
|
30
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.
|
30
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.19"
|
31
31
|
): ...
|
32
32
|
def is_closed(self) -> bool: ...
|
33
33
|
@property
|
@@ -85,7 +85,7 @@ class Client:
|
|
85
85
|
_snapshotted: bool
|
86
86
|
|
87
87
|
def __init__(
|
88
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.
|
88
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.19"
|
89
89
|
): ...
|
90
90
|
def is_closed(self) -> bool: ...
|
91
91
|
@property
|
modal/runner.py
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
# Copyright Modal Labs 2025
|
2
|
+
"""Internal module for building and running Apps."""
|
3
|
+
# Note: While this is mostly internal code, the `modal.runner.deploy_app` function was
|
4
|
+
# the only way to programmatically deploy Apps for some time, so users have reached into here.
|
5
|
+
# We may eventually deprecate it from the public API, but for now we should keep that in mind.
|
6
|
+
|
2
7
|
import asyncio
|
3
8
|
import dataclasses
|
4
9
|
import os
|
@@ -473,40 +478,22 @@ async def _deploy_app(
|
|
473
478
|
environment_name: Optional[str] = None,
|
474
479
|
tag: str = "",
|
475
480
|
) -> DeployResult:
|
476
|
-
"""
|
477
|
-
|
478
|
-
Typically, using the command-line tool `modal deploy <module or script>`
|
479
|
-
should be used, instead of this method.
|
480
|
-
|
481
|
-
**Usage:**
|
482
|
-
|
483
|
-
```python
|
484
|
-
if __name__ == "__main__":
|
485
|
-
deploy_app(app)
|
486
|
-
```
|
487
|
-
|
488
|
-
Deployment has two primary purposes:
|
481
|
+
"""Internal function for deploying an App.
|
489
482
|
|
490
|
-
|
491
|
-
current app run. For schedules this enables headless "cron"-like
|
492
|
-
functionality where scheduled functions continue to be invoked after
|
493
|
-
the client has disconnected.
|
494
|
-
* Allows for certain kinds of these objects, _deployment objects_, to be
|
495
|
-
referred to and used by other apps.
|
483
|
+
Users should prefer the `modal deploy` CLI or the `App.deploy` method.
|
496
484
|
"""
|
497
485
|
if environment_name is None:
|
498
486
|
environment_name = typing.cast(str, config.get("environment"))
|
499
487
|
|
500
|
-
name = name or app.name
|
488
|
+
name = name or app.name or ""
|
501
489
|
if not name:
|
502
490
|
raise InvalidError(
|
503
|
-
"You need to either supply
|
504
|
-
"or have a name set on the app.\n"
|
491
|
+
"You need to either supply a deployment name or have a name set on the app.\n"
|
505
492
|
"\n"
|
506
493
|
"Examples:\n"
|
507
|
-
'
|
494
|
+
'modal.runner.deploy_app(app, name="some_name")\n\n'
|
508
495
|
"or\n"
|
509
|
-
'app = App("some-name")'
|
496
|
+
'app = modal.App("some-name")'
|
510
497
|
)
|
511
498
|
else:
|
512
499
|
check_object_name(name, "App")
|
@@ -18,11 +18,11 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
|
|
18
18
|
modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
|
19
19
|
modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
|
20
20
|
modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
|
21
|
-
modal/app.py,sha256=
|
22
|
-
modal/app.pyi,sha256=
|
21
|
+
modal/app.py,sha256=TnXw6EaejqwyJNawbtp177mG87ufJZClPoiIxO41Ioc,50664
|
22
|
+
modal/app.pyi,sha256=8oj9DpTHySHymjy6aSat6IG-z2FF77mx_ls1dGbt3Qg,28222
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
24
|
modal/client.py,sha256=U-YKSw0n7J1ZLREt9cbEJCtmHe5YoPKFxl0xlkan2yc,15565
|
25
|
-
modal/client.pyi,sha256=
|
25
|
+
modal/client.pyi,sha256=wSvN4PKoC4BazCyPhTWaAjvyruNM7vlVoKhuICNBBIE,7593
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
|
28
28
|
modal/cls.py,sha256=GvaNl8R5UsH7Vg88WEOyerdjvZEPK7xxi3nqHlyOW_c,33497
|
@@ -62,7 +62,7 @@ modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
62
62
|
modal/queue.py,sha256=OIYmve1a4GTP54Vj2CcLatLPIAWToU7hWBNeu7IJiBY,18985
|
63
63
|
modal/queue.pyi,sha256=sgvELCK4bJXMZIZw7gllooGFZNipGjI3BT4rmUuyD9M,10282
|
64
64
|
modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
|
65
|
-
modal/runner.py,sha256=
|
65
|
+
modal/runner.py,sha256=yK1mBkX1_ZKvvWLoe1e2mGehJSWs97Mpyglo9Oj5rQw,24783
|
66
66
|
modal/runner.pyi,sha256=HW2pvC_PLwg1Es_EkrfQgMZsktIr9zzVEtmjOVFG6Dw,5351
|
67
67
|
modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
|
68
68
|
modal/sandbox.py,sha256=CX42Rrso7a_Gz6fWEEu-OYzFsWanWOyBy9iQ4nAfAkg,32162
|
@@ -82,7 +82,7 @@ modal/volume.py,sha256=3c5_aJNJtgpsFRZWBjc0jwn8Zs0jo9V6UDmh6ifrbdA,40145
|
|
82
82
|
modal/volume.pyi,sha256=juOVWGlgz7IeOY4M7jBhbeNRPA9xdGUwvA3AzlZUscQ,17958
|
83
83
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
84
84
|
modal/_runtime/asgi.py,sha256=KNarxvZI9z8fnmZl2vbkWTjnoLXs9kqOahkrbsTLkyc,22429
|
85
|
-
modal/_runtime/container_io_manager.py,sha256=
|
85
|
+
modal/_runtime/container_io_manager.py,sha256=6j0jO2-s9ShckM4SK45OapoQxWW9HQwQjFaBkXPJPwU,44763
|
86
86
|
modal/_runtime/container_io_manager.pyi,sha256=3N9TOYa5hfufhJV5IiIhpvJYCeLZe-ne76-XuxcFLW0,16147
|
87
87
|
modal/_runtime/execution_context.py,sha256=73Y5zH_o-MhVCrkJXakYVlFkKqCa2CWvqoHjOfJrJGg,3034
|
88
88
|
modal/_runtime/execution_context.pyi,sha256=TAxQq7uLj7i9r9XbXgFZiSVBWxObFWN-rkssS0I7Vkk,661
|
@@ -128,7 +128,7 @@ modal/cli/launch.py,sha256=0_sBu6bv2xJEPWi-rbGS6Ri9ggnkWQvrGlgpYSUBMyY,3097
|
|
128
128
|
modal/cli/network_file_system.py,sha256=eq3JnwjbfFNsJodIyANHL06ByYc3BSavzdmu8C96cHA,7948
|
129
129
|
modal/cli/profile.py,sha256=0TYhgRSGUvQZ5LH9nkl6iZllEvAjDniES264dE57wOM,3201
|
130
130
|
modal/cli/queues.py,sha256=6gTu76dzBtPN5eQVsLrvQpuru5jI9ZCWK5Eh8J8XhaM,4498
|
131
|
-
modal/cli/run.py,sha256=
|
131
|
+
modal/cli/run.py,sha256=DPa-yQ9o7vjqwvs_TAOvVJxS51yVn__ZGCnbkORL37g,23972
|
132
132
|
modal/cli/secret.py,sha256=WB_c-LE9-eDqleLpJxsJ9rZw62Eeza8ZFQFR10vNMEk,4197
|
133
133
|
modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
|
134
134
|
modal/cli/utils.py,sha256=hZmjyzcPjDnQSkLvycZD2LhGdcsfdZshs_rOU78EpvI,3717
|
@@ -145,10 +145,10 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
|
|
145
145
|
modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
|
146
146
|
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
147
147
|
modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
|
148
|
-
modal-0.74.
|
148
|
+
modal-0.74.19.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
149
149
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
150
150
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
151
|
-
modal_docs/gen_reference_docs.py,sha256=
|
151
|
+
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
152
152
|
modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
153
153
|
modal_docs/mdmd/mdmd.py,sha256=Irx49MCCTlBOP4FBdLR--JrpA3-WhsVeriq0LGgsRic,6232
|
154
154
|
modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
|
@@ -170,9 +170,9 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
|
|
170
170
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
171
171
|
modal_version/__init__.py,sha256=m94xZNWIjH8oUtJk4l9xfovzDJede2o7X-q0MHVECtM,470
|
172
172
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
173
|
-
modal_version/_version_generated.py,sha256=
|
174
|
-
modal-0.74.
|
175
|
-
modal-0.74.
|
176
|
-
modal-0.74.
|
177
|
-
modal-0.74.
|
178
|
-
modal-0.74.
|
173
|
+
modal_version/_version_generated.py,sha256=gnhxZOCXj_bRya3jnYgGg-_unrUkIoDxJUMPO5LnVz0,149
|
174
|
+
modal-0.74.19.dist-info/METADATA,sha256=xfMm5VTZynErYWFfwZ0xu5TyBDzl6PxByuJll7Raras,2474
|
175
|
+
modal-0.74.19.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
176
|
+
modal-0.74.19.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
177
|
+
modal-0.74.19.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
178
|
+
modal-0.74.19.dist-info/RECORD,,
|
modal_docs/gen_reference_docs.py
CHANGED
@@ -79,7 +79,6 @@ def run(output_dir: str = None):
|
|
79
79
|
("modal.call_graph", "modal.call_graph"),
|
80
80
|
("modal.container_process", "modal.container_process"),
|
81
81
|
("modal.gpu", "modal.gpu"),
|
82
|
-
("modal.runner", "modal.runner"),
|
83
82
|
("modal.io_streams", "modal.io_streams"),
|
84
83
|
("modal.file_io", "modal.file_io"),
|
85
84
|
]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|