modal 0.72.4__py3-none-any.whl → 0.72.48__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 (73) hide show
  1. modal/_container_entrypoint.py +5 -10
  2. modal/_object.py +297 -0
  3. modal/_resolver.py +7 -5
  4. modal/_runtime/container_io_manager.py +0 -11
  5. modal/_runtime/user_code_imports.py +7 -7
  6. modal/_serialization.py +4 -3
  7. modal/_tunnel.py +1 -1
  8. modal/app.py +14 -61
  9. modal/app.pyi +25 -25
  10. modal/cli/app.py +3 -2
  11. modal/cli/container.py +1 -1
  12. modal/cli/import_refs.py +185 -113
  13. modal/cli/launch.py +10 -5
  14. modal/cli/programs/run_jupyter.py +2 -2
  15. modal/cli/programs/vscode.py +3 -3
  16. modal/cli/run.py +134 -68
  17. modal/client.py +1 -0
  18. modal/client.pyi +18 -14
  19. modal/cloud_bucket_mount.py +4 -0
  20. modal/cloud_bucket_mount.pyi +4 -0
  21. modal/cls.py +33 -5
  22. modal/cls.pyi +20 -5
  23. modal/container_process.pyi +8 -6
  24. modal/dict.py +1 -1
  25. modal/dict.pyi +32 -29
  26. modal/environments.py +1 -1
  27. modal/environments.pyi +2 -1
  28. modal/experimental.py +47 -11
  29. modal/experimental.pyi +29 -0
  30. modal/file_io.pyi +30 -28
  31. modal/file_pattern_matcher.py +32 -25
  32. modal/functions.py +31 -23
  33. modal/functions.pyi +57 -50
  34. modal/gpu.py +19 -26
  35. modal/image.py +47 -19
  36. modal/image.pyi +28 -21
  37. modal/io_streams.pyi +14 -12
  38. modal/mount.py +14 -5
  39. modal/mount.pyi +28 -25
  40. modal/network_file_system.py +7 -7
  41. modal/network_file_system.pyi +27 -24
  42. modal/object.py +2 -265
  43. modal/object.pyi +46 -130
  44. modal/parallel_map.py +2 -2
  45. modal/parallel_map.pyi +10 -7
  46. modal/partial_function.py +22 -3
  47. modal/partial_function.pyi +45 -27
  48. modal/proxy.py +1 -1
  49. modal/proxy.pyi +2 -1
  50. modal/queue.py +1 -1
  51. modal/queue.pyi +26 -23
  52. modal/runner.py +14 -3
  53. modal/sandbox.py +11 -7
  54. modal/sandbox.pyi +30 -27
  55. modal/secret.py +1 -1
  56. modal/secret.pyi +2 -1
  57. modal/token_flow.pyi +6 -4
  58. modal/volume.py +1 -1
  59. modal/volume.pyi +36 -33
  60. {modal-0.72.4.dist-info → modal-0.72.48.dist-info}/METADATA +2 -2
  61. {modal-0.72.4.dist-info → modal-0.72.48.dist-info}/RECORD +73 -71
  62. modal_proto/api.proto +151 -4
  63. modal_proto/api_grpc.py +113 -0
  64. modal_proto/api_pb2.py +998 -795
  65. modal_proto/api_pb2.pyi +430 -11
  66. modal_proto/api_pb2_grpc.py +233 -1
  67. modal_proto/api_pb2_grpc.pyi +75 -3
  68. modal_proto/modal_api_grpc.py +7 -0
  69. modal_version/_version_generated.py +1 -1
  70. {modal-0.72.4.dist-info → modal-0.72.48.dist-info}/LICENSE +0 -0
  71. {modal-0.72.4.dist-info → modal-0.72.48.dist-info}/WHEEL +0 -0
  72. {modal-0.72.4.dist-info → modal-0.72.48.dist-info}/entry_points.txt +0 -0
  73. {modal-0.72.4.dist-info → modal-0.72.48.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.72.4
3
+ Version: 0.72.48
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -21,7 +21,7 @@ Requires-Dist: fastapi
21
21
  Requires-Dist: grpclib (==0.4.7)
22
22
  Requires-Dist: protobuf (!=4.24.0,<6.0,>=3.19)
23
23
  Requires-Dist: rich (>=12.0.0)
24
- Requires-Dist: synchronicity (~=0.9.8)
24
+ Requires-Dist: synchronicity (~=0.9.9)
25
25
  Requires-Dist: toml
26
26
  Requires-Dist: typer (>=0.9)
27
27
  Requires-Dist: types-certifi
@@ -2,86 +2,88 @@ modal/__init__.py,sha256=3NJLLHb0TRc2tc68kf8NHzORx38GbtbZvPEWDWrQ6N4,2234
2
2
  modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
3
3
  modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
4
4
  modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
5
- modal/_container_entrypoint.py,sha256=U1ZU-Sa0LC646YPh0AWSGVBHmzfTxYUiGu2viKzW-Zs,29643
5
+ modal/_container_entrypoint.py,sha256=iHSNqLCTK4uXzcmhF5ou5AqOYovk4hMfV3BZYYDrFKc,29554
6
6
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
7
7
  modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
8
+ modal/_object.py,sha256=ItQcsMNkz9Y3kdTsvfNarbW-paJ2qabDyQ7njaqY0XI,11359
8
9
  modal/_output.py,sha256=0fWX_KQwhER--U81ys16CL-pA5A-LN20C0EZjElKGJQ,25410
9
10
  modal/_proxy_tunnel.py,sha256=gnKyCfmVB7x2d1A6c-JDysNIP3kEFxmXzhcXhPrzPn0,1906
10
11
  modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
11
- modal/_resolver.py,sha256=TtowKu2LdZ7NpiYkSXs058BZ4ivY8KVYdchqLfREkiA,6775
12
+ modal/_resolver.py,sha256=D9IAdZKNqRPwgPDaB-XMKGtO8G0GwtBzG6xdgiXKdCk,6945
12
13
  modal/_resources.py,sha256=5qmcirXUI8dSH926nwkUaeX9H25mqYu9mXD_KuT79-o,1733
13
- modal/_serialization.py,sha256=qPLH6OUEBas1CT-a6i5pOP1hPGt5AfKr9q7RMUTFOMc,18722
14
+ modal/_serialization.py,sha256=x0uArKNXg89SfmKMUaLup_moHodax9weZItkChKeQ64,18745
14
15
  modal/_traceback.py,sha256=IZQzB3fVlUfMHOSyKUgw0H6qv4yHnpyq-XVCNZKfUdA,5023
15
- modal/_tunnel.py,sha256=o-jJhS4vQ6-XswDhHcJWGMZZmD03SC0e9i8fEu1JTjo,6310
16
+ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
16
17
  modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
17
18
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
18
- modal/app.py,sha256=1h8v96KuIg_SAdWDK9gNWVOYYFciBIerhldRPjvDgxs,45511
19
- modal/app.pyi,sha256=Gx7gxjfQ70sxhbwfpx1VjvzEON-ZEMTJ_Vy8qt0oQvo,25302
19
+ modal/app.py,sha256=KNfzLlkI2dJPl9LY8AgW76whZpwIvYKi2E2p9u4F3N4,43659
20
+ modal/app.pyi,sha256=vnQhENaQBhJO6el-ieOcw3NEeYQ314SFXRDtjij4DM8,25324
20
21
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
21
- modal/client.py,sha256=JAnd4-GCN093BwkvOFAK5a6iy5ycxofjpUncMxlrIMw,15253
22
- modal/client.pyi,sha256=m8LzW64Ywdd96wK4kywyhj6vPrPCR-JrddgqlGvckRQ,7278
23
- modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
24
- modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
25
- modal/cls.py,sha256=3hjb0JcoPjxKZNeK22f5rR43bZRBjoRI7_EMZXY7YrE,31172
26
- modal/cls.pyi,sha256=ooDU2IaGgD5VQ3jDX2KCrqb3a91-AdKv8yKYSkjnW8Y,8230
22
+ modal/client.py,sha256=8SQawr7P1PNUCq1UmJMUQXG2jIo4Nmdcs311XqrNLRE,15276
23
+ modal/client.pyi,sha256=kzowbosjZXwpmAYhsd464XDVygnDt1nDYFxJNSNIjNg,7593
24
+ modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
25
+ modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
26
+ modal/cls.py,sha256=7Czu5ff8Sezzl4ayHyI9nMgB0el3401_uHvyZU4vbhc,32206
27
+ modal/cls.pyi,sha256=LrX2YVbcRqSKioOtXIMT9NShe4gaVYpDKt16SDZHh5s,8966
27
28
  modal/config.py,sha256=BzhZYUUwOmvVwf6x5kf0ywMC257s648dmuhsnB6g3gk,11041
28
29
  modal/container_process.py,sha256=WTqLn01dJPVkPpwR_0w_JH96ceN5mV4TGtiu1ZR2RRA,6108
29
- modal/container_process.pyi,sha256=dqtqBmyRpXXpRrDooESL6WBVU_1Rh6OG-66P2Hk9E5U,2666
30
- modal/dict.py,sha256=ei9jsA5iTj4UFGPJxTAed6vjd49W47ezDtj0koUmVts,12497
31
- modal/dict.pyi,sha256=VmbzxltA2vFlIHZCxpNGtd-ieXwcUwdw3iyy3WCweqU,7115
32
- modal/environments.py,sha256=wbv9ttFCbzATGfwcmvYiG608PfHovx0AQmawsg-jmic,6660
33
- modal/environments.pyi,sha256=rF7oaaELoSNuoD6qImGnIbuGPtgWwR5SlcExyYJ61hQ,3515
30
+ modal/container_process.pyi,sha256=Hf0J5JyDdCCXBJSKx6gvkPOo0XrztCm78xzxamtzUjQ,2828
31
+ modal/dict.py,sha256=lKxvBcbcFZRARiqfolyRUW08x3RcozWL3MZuW2-Eu4U,12498
32
+ modal/dict.pyi,sha256=kKb0Kc6RUabtQ5Hwslg_vwL_OIrwIAJ2NXrJTepTtp4,7684
33
+ modal/environments.py,sha256=20doFhRnm1fae30LMOp8hSYbIfR7yFZTtbLdo5PrSj4,6661
34
+ modal/environments.pyi,sha256=RXE3slyEr9tWpfS84Fj7iUzNJy-SujlqWOQTE8A4Qaw,3537
34
35
  modal/exception.py,sha256=4JyO-SACaLNDe2QC48EjsK8GMkZ8AgEurZ8j1YdRu8E,5263
35
- modal/experimental.py,sha256=npfKbyMpI41uZZs9HW_QiB3E4ykWfDXZbACXXbw6qeA,2385
36
+ modal/experimental.py,sha256=H9FXT3kshbjPLovshT10DicyOkGFrPqILy-qdTX-P7s,4015
37
+ modal/experimental.pyi,sha256=24tIYu_w9RLwFrz1cIsgYuqmDCtV8eg6-bQNz3zjhDo,939
36
38
  modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
37
- modal/file_io.pyi,sha256=NrIoB0YjIqZ8MDMe826xAnybT0ww_kxQM3iPLo82REU,8898
38
- modal/file_pattern_matcher.py,sha256=uksEpQG4LSNdW57NQVqP9oOWPpD2-c9QVaAN_dmzKIQ,6415
39
- modal/functions.py,sha256=3uJPbrEAWhpFfLfUnoRjGmvEUC-_wVh-8yNJBx8eVeM,68249
40
- modal/functions.pyi,sha256=LiSDgH-X7jcZ56pAoLMwo3x9Dzdp_3Sd7W5MVAJPoCg,25407
41
- modal/gpu.py,sha256=MTxj6ql8EpgfBg8YmZ5a1cLznyuZFssX1qXbEX4LKVM,7503
42
- modal/image.py,sha256=_ALAfk8YEiWnv_pHSnixBPoR88RGSDstsAUvlJa1nKc,89802
43
- modal/image.pyi,sha256=NfZyLkl4rmxpc5fokaO4mmEeGFOwGn0AndV1vKwBdbs,26027
39
+ modal/file_io.pyi,sha256=NTRft1tbPSWf9TlWVeZmTlgB5AZ_Zhu2srWIrWr7brk,9445
40
+ modal/file_pattern_matcher.py,sha256=dSo7BMQGZBAuoBFOX-e_72HxmF3FLzjQlEtnGtJiaD4,6506
41
+ modal/functions.py,sha256=BrqbgeKpuoiA3-waNfdmUJfAGF7BsbQHvlTfAS1eHNQ,69046
42
+ modal/functions.pyi,sha256=m2a2ZnjqZFC6REG1_uhA5LM0O1etkFbQH3KnsLSXUKs,26533
43
+ modal/gpu.py,sha256=2qZMNnoMrjU-5Bu7fx68pANUAKTtZq0EWEEeBA9OUVQ,7426
44
+ modal/image.py,sha256=leeY7fLfFjS0IqTi3D4cRxIDOb80BPtb3jsQfqvVJ8c,90912
45
+ modal/image.pyi,sha256=QMKS6E3CsZr5DoyNqGpcJPBYJTJZSvtAQIsAhPVd_E4,26347
44
46
  modal/io_streams.py,sha256=QkQiizKRzd5bnbKQsap31LJgBYlAnj4-XkV_50xPYX0,15079
45
- modal/io_streams.pyi,sha256=bCCVSxkMcosYd8O3PQDDwJw7TQ8JEcnYonLJ5t27TQs,4804
46
- modal/mount.py,sha256=nGimxizRzCpyZu9cpTdKQRgU9uqMnl3xBrTRR_rD6fE,31480
47
- modal/mount.pyi,sha256=mcKMYwt8dX3oO8OzzKqCdh7K2EhMhWIHEPoJwzi1rl8,12194
48
- modal/network_file_system.py,sha256=INj1TfN_Fsmabmlte7anvey1epodjbMmjBW_TIJSST4,14406
49
- modal/network_file_system.pyi,sha256=61M-sdWrtaRjmuNVsvusI6kf1Qw-jUOVXvEAeOkM8Aw,7751
50
- modal/object.py,sha256=HZs3N59C6JxlMuPQWJYvrWV1FEEkH9txUovVDorVUbs,9763
51
- modal/object.pyi,sha256=MO78H9yFSE5i1gExPEwyyQzLdlshkcGHN1aQ0ylyvq0,8802
47
+ modal/io_streams.pyi,sha256=bJ7ZLmSmJ0nKoa6r4FJpbqvzdUVa0lEe0Fa-MMpMezU,5071
48
+ modal/mount.py,sha256=JuZZ2IJuypv1_9qK8R_LepX5oEWFTALdjIVA7_9HNC0,31802
49
+ modal/mount.pyi,sha256=dvdr4joSpW7oKnKyg9eDD0obFfekwZtW65j4NEomivQ,12523
50
+ modal/network_file_system.py,sha256=Jcr5Whar0MgA2YItJLJWmzHDnkkDlcOzO63TRkA64zA,14407
51
+ modal/network_file_system.pyi,sha256=4N3eqMbTSlqmS8VV_aJK-uvrgJC8xnf_YtW5FHfRfc8,8156
52
+ modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
53
+ modal/object.pyi,sha256=kyJkRQcVv3ct7zSAxvvXcuhBVeH914v80uSlqeS7cA4,5632
52
54
  modal/output.py,sha256=N0xf4qeudEaYrslzdAl35VKV8rapstgIM2e9wO8_iy0,1967
53
- modal/parallel_map.py,sha256=4aoMXIrlG3wl5Ifk2YDNOQkXsGRsm6Xbfm6WtJ2t3WY,16002
54
- modal/parallel_map.pyi,sha256=pOhT0P3DDYlwLx0fR3PTsecA7DI8uOdXC1N8i-ZkyOY,2328
55
- modal/partial_function.py,sha256=KSpHhu7Gsbe4h-5mcJjxnE4328biKOB7yVouHZbObA8,27798
56
- modal/partial_function.pyi,sha256=pO6kf8i5HVsZ7CF0z_KkzLk4Aeq7NJhFJ_VNIycRXaU,9260
57
- modal/proxy.py,sha256=ZrOsuQP7dSZFq1OrIxalNnt0Zvsnp1h86Th679sSL40,1417
58
- modal/proxy.pyi,sha256=UvygdOYneLTuoDY6hVaMNCyZ947Tmx93IdLjErUqkvM,368
55
+ modal/parallel_map.py,sha256=POBTyiWabe2e4qBNlsjjksiu1AAPEsNqI-mM8cgNFco,16042
56
+ modal/parallel_map.pyi,sha256=0ltjcIpPUqPGGOWmHqzCfBu5y3ISjRZDrqOJhiNhfYk,2522
57
+ modal/partial_function.py,sha256=4_hGVCCX-dYdjs_86Metfsuih8YyypiVMrExcwRGDS8,28711
58
+ modal/partial_function.pyi,sha256=Dj4WDxbGkXjxAbucSBSqr2_vrNbEWEAwdXnMzh2d80Y,9905
59
+ modal/proxy.py,sha256=NrOevrWxG3G7-zlyRzG6BcIvop7AWLeyahZxitbBaOk,1418
60
+ modal/proxy.pyi,sha256=1OEKIVUyC-xb7fHMzngakQso0nTsK60TVhXtlcMj6Wk,390
59
61
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- modal/queue.py,sha256=zMUQtdAyqZzBg-2iAo3c3G54HLP7TEWfVhiQXLjewb4,18556
61
- modal/queue.pyi,sha256=gGV97pWelSSYqMV9Bl4ys3mSP7q82fS71oqSWeAwyDE,9818
62
+ modal/queue.py,sha256=HPnyJuX-THDEl2ak-xqf2lxYJMiQw4e37y4vHz6FRCg,18557
63
+ modal/queue.pyi,sha256=sgvELCK4bJXMZIZw7gllooGFZNipGjI3BT4rmUuyD9M,10282
62
64
  modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
63
- modal/runner.py,sha256=mhqgRdjD5cUDpBQIokiX7OCfVblpGV6aWmZ-WvWJgGg,24114
65
+ modal/runner.py,sha256=0SCMgKO8lZ9W1C7le1EcgViKERMXpi_-QBd6PF_MH0Q,24450
64
66
  modal/runner.pyi,sha256=YmP4EOCNjjkwSIPi2Gl6hF_ji_ytkxz9dw3iB9KXaOI,5275
65
67
  modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
66
- modal/sandbox.py,sha256=H63K3MTcgdb9KkKc79sMKe6UzFMGBNI7HB2TUwBbE_U,28609
67
- modal/sandbox.pyi,sha256=lceWDeXqzdeRc1iIuM5YmpoZlBJcVBpQO1Jc3AT1AQI,20809
68
+ modal/sandbox.py,sha256=h5bgvt98iFmQs4aBu_d2aR6qP5UM5QVdP3wgm_P7RgE,29014
69
+ modal/sandbox.pyi,sha256=XtiDHYa4HOooyuEPmKFwEqO58AJBJVTceO_1HQyDwII,21343
68
70
  modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
69
71
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
70
- modal/secret.py,sha256=lebVTZi4fC9PXQpLVmsvgQLzy-2Kzxv1WBD0Jr2wsxQ,10117
71
- modal/secret.pyi,sha256=0SyCyiYamr97htTmMjPZKvp5AQZKFF9GO_Ia2VcgrtA,2952
72
+ modal/secret.py,sha256=XTqrpR4rnkuUb-bth3qM_xxPqqEWorSoN9qDwjWRcXo,10118
73
+ modal/secret.pyi,sha256=W4g_BOSxafYm-K9PvFc7-li3a-rsCFNkYgHTZXr1AFA,2974
72
74
  modal/serving.py,sha256=MnVuTsimN05LfNPxuJZ4sr5s1_BPUkIsOP_VC-bkp78,4464
73
75
  modal/serving.pyi,sha256=ncV-9jY_vZYFnGs5ZnMb3ffrX8LmcLdIMHBC56xRbtE,1711
74
76
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
75
77
  modal/token_flow.py,sha256=LcgSce_MSQ2p7j55DPwpVRpiAtCDe8GRSEwzO7muNR8,6774
76
- modal/token_flow.pyi,sha256=gOYtYujrWt_JFZeiI8EmfahXPx5GCR5Na-VaPQcWgEY,1937
77
- modal/volume.py,sha256=NoqdOTrjSUEBkUj-Of_oi7I_yCuNmaLqr3TIsTWOddM,29674
78
- modal/volume.pyi,sha256=GfyVeLyM7DMiBlg0I5N6OtJl0Bzv0-rNQXkWVO0j5c0,11903
78
+ modal/token_flow.pyi,sha256=0XV3d-9CGQL3qjPdw3RgwIFVqqxo8Z-u044_mkgAM3o,2064
79
+ modal/volume.py,sha256=DdM9NhqNkqrk4BbAZdAgzI1jZws7NN2tYANO4OuM8hQ,29675
80
+ modal/volume.pyi,sha256=kTsXarphjZILXci84LQy7EyC84eXUs5-7D62IM5q3eE,12491
79
81
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
80
82
  modal/_runtime/asgi.py,sha256=c4hmaMW1pLo-cm7ouriJjieuFm4ZF6D2LMy0638sfOs,22139
81
- modal/_runtime/container_io_manager.py,sha256=HgDLjE78yy1P7WZTmsEVDf89YnFFWG63Ddes8uYLVDY,43764
83
+ modal/_runtime/container_io_manager.py,sha256=drb-cY78h8P9Krzmmjex7uZlSSocniEF5cIXmUcvGnY,43145
82
84
  modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
83
85
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
84
- modal/_runtime/user_code_imports.py,sha256=n4CQOojzSdf0jwSKSy6MEnVX3IWl3t3Dq54-x9VS2Ds,14663
86
+ modal/_runtime/user_code_imports.py,sha256=c06azC0MtYHHCGWWRGxsVY0uMAjQKe1QEj-i0oXqbWM,14699
85
87
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
86
88
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
87
89
  modal/_utils/async_utils.py,sha256=9ubwMkwiDB4gzOYG2jL9j7Fs-5dxHjcifZe3r7JRg-k,25091
@@ -108,25 +110,25 @@ modal/_vendor/tblib.py,sha256=g1O7QUDd3sDoLd8YPFltkXkih7r_fyZOjgmGuligv3s,9722
108
110
  modal/cli/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
109
111
  modal/cli/_download.py,sha256=t6BXZwjTd9MgznDvbsV8rp0FZWggdzC-lUAGZU4xx1g,3984
110
112
  modal/cli/_traceback.py,sha256=QlLa_iw3fAOA-mqCqjS8qAxvNT48J3YY3errtVVc2cw,7316
111
- modal/cli/app.py,sha256=HkwI38FZxx66jxiur4o_DRN3uwyO3L8hqgyo8oXKZxc,7726
113
+ modal/cli/app.py,sha256=TmUiFKAE1yc6ll8pfl-wZ2lh9crC31Fu_8_YKCX8NJc,7818
112
114
  modal/cli/config.py,sha256=pXPLmX0bIoV57rQNqIPK7V-yllj-GPRY4jiBO_EklGg,1667
113
- modal/cli/container.py,sha256=nCySVD10VJPzmX3ghTsGmpxdYeVYYMW6ofjsyt2gQcM,3667
115
+ modal/cli/container.py,sha256=FYwEgjf93j4NMorAjGbSV98i1wpebqdAeNU1wfrFp1k,3668
114
116
  modal/cli/dict.py,sha256=HaEcjfll7i3Uj3Fg56aj4407if5UljsYfr6fIq-D2W8,4589
115
117
  modal/cli/entry_point.py,sha256=aaNxFAqZcmtSjwzkYIA_Ba9CkL4cL4_i2gy5VjoXxkM,4228
116
118
  modal/cli/environment.py,sha256=Ayddkiq9jdj3XYDJ8ZmUqFpPPH8xajYlbexRkzGtUcg,4334
117
- modal/cli/import_refs.py,sha256=wnqE5AMeyAN3IZmQvJCp54KRnJh8Nq_5fMqB6u6GEL8,9147
118
- modal/cli/launch.py,sha256=t1XsExzTWip4n9Cqa-Jhzj65P6bVHO0je2d76JQRi_w,2990
119
+ modal/cli/import_refs.py,sha256=vp4r28FGnag3hKRbR_haiuCIGmOTthrhcGhAqSwwc7Q,11753
120
+ modal/cli/launch.py,sha256=pzQt2QlcrbIUU0MVzWWPAvMQ6MCyqsHZ0X9JcV-sY04,3242
119
121
  modal/cli/network_file_system.py,sha256=o6VLTgN4xn5XUiNPBfxYec-5uWCgYrDmfFFLM1ZW_eE,8180
120
122
  modal/cli/profile.py,sha256=rLXfjJObfPNjaZvNfHGIKqs7y9bGYyGe-K7V0w-Ni0M,3110
121
123
  modal/cli/queues.py,sha256=MIh2OsliNE2QeL1erubfsRsNuG4fxqcqWA2vgIfQ4Mg,4494
122
- modal/cli/run.py,sha256=QMs3BVSkq8jve76BqgstGt4C6jilbDD9gpCCRPuHUy0,17879
124
+ modal/cli/run.py,sha256=1rIfCRuCJb5fJQPW2j9huHh9h72u45g708IXf3QXKB8,20051
123
125
  modal/cli/secret.py,sha256=uQpwYrMY98iMCWeZOQTcktOYhPTZ8IHnyealDc2CZqo,4206
124
126
  modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
125
127
  modal/cli/utils.py,sha256=hZmjyzcPjDnQSkLvycZD2LhGdcsfdZshs_rOU78EpvI,3717
126
128
  modal/cli/volume.py,sha256=Jrm-1R9u92JbbUM62bkB9RzAM_jO8wi7T2-i6Cb2XG0,10568
127
129
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
128
- modal/cli/programs/run_jupyter.py,sha256=KNaxG4LixbBJdLOzwKZB5IMA6tO1CSjHMKY6SpaIXd0,2685
129
- modal/cli/programs/vscode.py,sha256=0k65NdAvRL3WGtngEYt-3w_kn9x2y3PqzA-dqdaVHtw,3383
130
+ modal/cli/programs/run_jupyter.py,sha256=1X8eQ3gB_IqkJn11Q4dQ9KdIqFVwQQlwkrrSqlFWfPQ,2685
131
+ modal/cli/programs/vscode.py,sha256=c5jKk1ruuC03X1D-hNc2jtTQqofCBweEZH_qxHjkHGo,3383
130
132
  modal/extensions/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
131
133
  modal/extensions/ipython.py,sha256=Xvzy-A7cvwMSDa9p4c4CEMLOX2_Xsg9DkM1J9uyu7jc,983
132
134
  modal/requirements/2023.12.312.txt,sha256=zWWUVgVQ92GXBKNYYr2-5vn9rlnXcmkqlwlX5u1eTYw,400
@@ -148,13 +150,13 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
148
150
  modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
149
151
  modal_global_objects/mounts/python_standalone.py,sha256=pEML5GaV2_0ahci_1vpfc_FnySpsfi2fhYmFF5I7IiQ,1837
150
152
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
151
- modal_proto/api.proto,sha256=1hO6_dn7DwgFra9TQSAXBt1NV4ETiiURPHe09bodinc,80368
152
- modal_proto/api_grpc.py,sha256=VakjV_Ge3fgZDRJN6EeG2yY_LMkZvn6yVXr5SnFKIDA,103542
153
- modal_proto/api_pb2.py,sha256=77arFb-gAsuI-7Rbr65FxAB13i-mPoJEHYvs7z5Uo1s,295839
154
- modal_proto/api_pb2.pyi,sha256=iGrfDlLXPg8oC9QdWOFlCrNoJqB0FompkpVa-EskYOg,394251
155
- modal_proto/api_pb2_grpc.py,sha256=OAvrG7OCPKmF-6eawqc4X5iLN0WFBQ_AvufuWnHm3Es,224030
156
- modal_proto/api_pb2_grpc.pyi,sha256=-bE8AO-IJsg0WMwSzEEe_jnmeirta3tqj5IwTVIrF6c,52169
157
- modal_proto/modal_api_grpc.py,sha256=kOABHGzB81bAhxqKwj79DKqdK2HlcC4U0MkFETkQwfQ,13826
153
+ modal_proto/api.proto,sha256=6Rt3GfhD5PWxmkAerWPFQZQ4TL7u0-s7PBcvajuKl5A,85069
154
+ modal_proto/api_grpc.py,sha256=_YeTxy_4EyqC4jp9eBsJWnziGRafK5c61kcvdWpJXRY,109089
155
+ modal_proto/api_pb2.py,sha256=uds7csRod6-2Hq3PehpeKJ82agfcfZc-fmKrQ4-01m0,310738
156
+ modal_proto/api_pb2.pyi,sha256=FBNlLVTt75Nq6G1JwnB_1nLz5WsK9XCOYoqNafXKSaA,413655
157
+ modal_proto/api_pb2_grpc.py,sha256=LlW5e2YKWPJS3lPYoJDyKjf1AxJSCCHi0DhupX05YyQ,235804
158
+ modal_proto/api_pb2_grpc.pyi,sha256=BM4068ohQqF1VUxvYdAYEVLgUebJVQvyrii-aXcel74,54910
159
+ modal_proto/modal_api_grpc.py,sha256=fYh-4oxTB8fB1NWrYm8S9-8umvKvAxJ58eNZ_e4B0WA,14556
158
160
  modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
159
161
  modal_proto/options.proto,sha256=a-siq4swVbZPfaFRXAipRZzGP2bq8OsdUvjlyzAeodQ,488
160
162
  modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
@@ -165,10 +167,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
165
167
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
168
  modal_version/__init__.py,sha256=kGya2ZlItX2zB7oHORs-wvP4PG8lg_mtbi1QIK3G6SQ,470
167
169
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
168
- modal_version/_version_generated.py,sha256=f4e7qyTZCPpyCUarmH2KNELfulika6S1oKpZUAreFj4,148
169
- modal-0.72.4.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
170
- modal-0.72.4.dist-info/METADATA,sha256=DiP1je0a_ziUpy36xipRnOuhvD31C733phKRFsZbD3I,2328
171
- modal-0.72.4.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
172
- modal-0.72.4.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
173
- modal-0.72.4.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
174
- modal-0.72.4.dist-info/RECORD,,
170
+ modal_version/_version_generated.py,sha256=Xs3RAy5-mYPVyOua-HPWlZv1-X6TY-gJwtgPIlQYUUk,149
171
+ modal-0.72.48.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
172
+ modal-0.72.48.dist-info/METADATA,sha256=S1s3imUuaXBcrEehulLXvb7XNrPF6uYx7EGuoTcI1Pg,2329
173
+ modal-0.72.48.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
174
+ modal-0.72.48.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
175
+ modal-0.72.48.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
176
+ modal-0.72.48.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -4,6 +4,7 @@ package modal.client;
4
4
 
5
5
  import "modal_proto/options.proto";
6
6
  import "google/protobuf/empty.proto";
7
+ import "google/protobuf/struct.proto";
7
8
  import "google/protobuf/wrappers.proto";
8
9
 
9
10
  enum AppDeployVisibility {
@@ -81,6 +82,7 @@ enum ClientType {
81
82
  CLIENT_TYPE_WORKER = 2;
82
83
  CLIENT_TYPE_CONTAINER = 3;
83
84
  CLIENT_TYPE_WEB_SERVER = 5;
85
+ CLIENT_TYPE_NOTEBOOK_KERNEL = 6;
84
86
  }
85
87
 
86
88
  enum CloudProvider {
@@ -150,6 +152,7 @@ enum GPUType {
150
152
  GPU_TYPE_L4 = 9;
151
153
  GPU_TYPE_H100 = 10;
152
154
  GPU_TYPE_L40S = 11;
155
+ GPU_TYPE_H200 = 12;
153
156
  }
154
157
 
155
158
  enum ObjectCreationType {
@@ -337,6 +340,7 @@ message AppGetLogsRequest {
337
340
  string function_id = 5;
338
341
  string input_id = 6;
339
342
  string task_id = 7;
343
+ string function_call_id = 9;
340
344
  FileDescriptor file_descriptor = 8;
341
345
  }
342
346
 
@@ -605,6 +609,8 @@ message CheckpointInfo {
605
609
  int64 size = 5;
606
610
  bool checksum_is_file_index = 6;
607
611
  string original_task_id = 7;
612
+ // snapshot version used to take the checkpoint
613
+ uint32 snapshot_version = 8;
608
614
  }
609
615
 
610
616
  message ClassCreateRequest {
@@ -712,6 +718,7 @@ message CloudBucketMount {
712
718
  bool requester_pays = 6;
713
719
  optional string bucket_endpoint_url = 7;
714
720
  optional string key_prefix = 8;
721
+ optional string oidc_auth_role_arn = 9;
715
722
  }
716
723
 
717
724
  message ContainerArguments { // This is used to pass data from the worker to the container
@@ -1157,7 +1164,7 @@ message Function {
1157
1164
 
1158
1165
  uint32 task_idle_timeout_secs = 25;
1159
1166
 
1160
- optional CloudProvider cloud_provider = 26;
1167
+ optional CloudProvider cloud_provider = 26; // Deprecated at some point
1161
1168
 
1162
1169
  uint32 warm_pool_size = 27;
1163
1170
 
@@ -1251,6 +1258,8 @@ message Function {
1251
1258
  bool method_definitions_set = 75;
1252
1259
 
1253
1260
  bool _experimental_custom_scaling = 76;
1261
+
1262
+ string cloud_provider_str = 77; // Supersedes cloud_provider
1254
1263
  }
1255
1264
 
1256
1265
  message FunctionAsyncInvokeRequest {
@@ -1661,9 +1670,10 @@ message FunctionUpdateSchedulingParamsRequest {
1661
1670
  message FunctionUpdateSchedulingParamsResponse {}
1662
1671
 
1663
1672
  message GPUConfig {
1664
- GPUType type = 1;
1673
+ GPUType type = 1; // Deprecated, at some point
1665
1674
  uint32 count = 2;
1666
1675
  uint32 memory = 3;
1676
+ string gpu_type = 4;
1667
1677
  }
1668
1678
 
1669
1679
  message GeneratorDone { // Sent as the output when a generator finishes running.
@@ -1879,6 +1889,76 @@ message NetworkAccess {
1879
1889
  repeated string allowed_cidrs = 2;
1880
1890
  }
1881
1891
 
1892
+ message NotebookKernelPublishResultsRequest {
1893
+ // See kernelshim.py for the differences between this and `ExecuteResult`.
1894
+ // https://jupyter-client.readthedocs.io/en/stable/messaging.html#execution-results
1895
+ message ExecuteReply {
1896
+ string status = 1;
1897
+ uint32 execution_count = 2;
1898
+ }
1899
+
1900
+ // IOPub message or reply received from the kernel for a cell.
1901
+ message CellResult {
1902
+ string cell_id = 1;
1903
+
1904
+ oneof result_type {
1905
+ // Persistent output that is saved in the notebook.
1906
+ NotebookOutput output = 2;
1907
+
1908
+ // Clear all previous outputs of the cell.
1909
+ bool clear_output = 3;
1910
+
1911
+ // Cell has finished executing, return the kernel's execute_reply.
1912
+ ExecuteReply execute_reply = 4;
1913
+ }
1914
+ }
1915
+
1916
+ string notebook_id = 1;
1917
+ repeated CellResult results = 2;
1918
+ }
1919
+
1920
+ // A single output from a notebook. When you execute a cell, it produces an
1921
+ // array of these outputs as the code runs.
1922
+ //
1923
+ // https://github.com/jupyter/nbformat/blob/v5.10.4/nbformat/v4/nbformat.v4.schema.json#L301-L309
1924
+ message NotebookOutput {
1925
+ // Result of executing a code cell.
1926
+ message ExecuteResult {
1927
+ uint32 execution_count = 1;
1928
+ google.protobuf.Struct data = 2; // mimebundle
1929
+ google.protobuf.Struct metadata = 3;
1930
+ }
1931
+
1932
+ // Data displayed as a result of code cell execution.
1933
+ message DisplayData {
1934
+ google.protobuf.Struct data = 1; // mimebundle
1935
+ google.protobuf.Struct metadata = 2;
1936
+
1937
+ // This should not be included in saved notebook.
1938
+ optional string transient_display_id = 3;
1939
+ }
1940
+
1941
+ // Stream output from a code cell (stdout / stderr).
1942
+ message Stream {
1943
+ string name = 1; // stdout | stderr
1944
+ string text = 2; // multiline_string
1945
+ }
1946
+
1947
+ // Output of an error that occurred during code cell execution.
1948
+ message Error {
1949
+ string ename = 1;
1950
+ string evalue = 2;
1951
+ repeated string traceback = 3;
1952
+ }
1953
+
1954
+ oneof output_type {
1955
+ ExecuteResult execute_result = 1;
1956
+ DisplayData display_data = 2;
1957
+ Stream stream = 3;
1958
+ Error error = 4;
1959
+ }
1960
+ }
1961
+
1882
1962
  message Object {
1883
1963
  string object_id = 1;
1884
1964
  oneof handle_metadata_oneof {
@@ -1925,6 +2005,14 @@ message Proxy {
1925
2005
  repeated ProxyIp proxy_ips = 4;
1926
2006
  }
1927
2007
 
2008
+ message ProxyAddIpRequest {
2009
+ string proxy_id = 1 [ (modal.options.audit_target_attr) = true ];
2010
+ }
2011
+
2012
+ message ProxyAddIpResponse {
2013
+ ProxyIp proxy_ip = 1;
2014
+ }
2015
+
1928
2016
  message ProxyCreateRequest {
1929
2017
  string name = 1 [ (modal.options.audit_target_attr) = true ];
1930
2018
  string environment_name = 2;
@@ -1977,6 +2065,10 @@ message ProxyListResponse {
1977
2065
  repeated Proxy proxies = 1;
1978
2066
  }
1979
2067
 
2068
+ message ProxyRemoveIpRequest {
2069
+ string proxy_ip = 1 [ (modal.options.audit_target_attr) = true ];
2070
+ }
2071
+
1980
2072
  message QueueClearRequest {
1981
2073
  string queue_id = 1;
1982
2074
  bytes partition_key = 2;
@@ -2116,7 +2208,7 @@ message Sandbox {
2116
2208
  repeated string secret_ids = 4;
2117
2209
 
2118
2210
  Resources resources = 5;
2119
- CloudProvider cloud_provider = 6;
2211
+ CloudProvider cloud_provider = 6; // Deprecated at some point
2120
2212
 
2121
2213
  uint32 timeout_secs = 7;
2122
2214
 
@@ -2152,6 +2244,16 @@ message Sandbox {
2152
2244
  NetworkAccess network_access = 22;
2153
2245
 
2154
2246
  optional string proxy_id = 23;
2247
+
2248
+ // Enable snapshotting the sandbox (both memory and filesystem).
2249
+ // This doesn't need to be enabled to save the filesystem as an image (i.e. a filesystem-only snapshot).
2250
+ bool enable_snapshot = 24;
2251
+
2252
+ // Used to pin gVisor version for memory-snapshottable sandboxes.
2253
+ // This field is set by the server, not the client.
2254
+ optional uint32 snapshot_version = 25;
2255
+
2256
+ string cloud_provider_str = 26; // Supersedes cloud_provider
2155
2257
  }
2156
2258
 
2157
2259
  message SandboxCreateRequest {
@@ -2173,10 +2275,13 @@ message SandboxGetLogsRequest {
2173
2275
 
2174
2276
  message SandboxGetTaskIdRequest {
2175
2277
  string sandbox_id = 1;
2278
+ optional float timeout = 2; // Legacy clients do not provide a timeout. New clients must always provide a timeout.
2279
+ bool wait_until_ready = 3; // If true, waits until the container's postStart hook has been run before returning. Useful for detecting init failures.
2176
2280
  }
2177
2281
 
2178
2282
  message SandboxGetTaskIdResponse {
2179
- string task_id = 1;
2283
+ optional string task_id = 1; // This is None if the sandbox was terminated before a task could be scheduled.
2284
+ optional GenericResult task_result = 2; // If the task has already exited, this is the result.
2180
2285
  }
2181
2286
 
2182
2287
  message SandboxGetTunnelsRequest {
@@ -2213,6 +2318,22 @@ message SandboxListResponse {
2213
2318
  repeated SandboxInfo sandboxes = 1;
2214
2319
  }
2215
2320
 
2321
+ message SandboxRestoreRequest {
2322
+ string snapshot_id = 1;
2323
+ }
2324
+
2325
+ message SandboxRestoreResponse {
2326
+ string sandbox_id = 1;
2327
+ }
2328
+
2329
+ message SandboxSnapshotFromIdRequest {
2330
+ string snapshot_id = 1;
2331
+ }
2332
+
2333
+ message SandboxSnapshotFromIdResponse {
2334
+ string snapshot_id = 1;
2335
+ }
2336
+
2216
2337
  message SandboxSnapshotFsRequest {
2217
2338
  string sandbox_id = 1;
2218
2339
  float timeout = 2;
@@ -2225,6 +2346,23 @@ message SandboxSnapshotFsResponse {
2225
2346
  ImageMetadata image_metadata = 3;
2226
2347
  }
2227
2348
 
2349
+ message SandboxSnapshotRequest {
2350
+ string sandbox_id = 1;
2351
+ }
2352
+
2353
+ message SandboxSnapshotResponse {
2354
+ string snapshot_id = 1;
2355
+ }
2356
+
2357
+ message SandboxSnapshotWaitRequest {
2358
+ string snapshot_id = 1;
2359
+ float timeout = 2;
2360
+ }
2361
+
2362
+ message SandboxSnapshotWaitResponse {
2363
+ GenericResult result = 1;
2364
+ }
2365
+
2228
2366
  message SandboxStdinWriteRequest {
2229
2367
  string sandbox_id = 1;
2230
2368
  bytes input = 2;
@@ -2820,12 +2958,17 @@ service ModalClient {
2820
2958
  rpc MountGetOrCreate(MountGetOrCreateRequest) returns (MountGetOrCreateResponse);
2821
2959
  rpc MountPutFile(MountPutFileRequest) returns (MountPutFileResponse);
2822
2960
 
2961
+ // Notebooks
2962
+ rpc NotebookKernelPublishResults(NotebookKernelPublishResultsRequest) returns (google.protobuf.Empty);
2963
+
2823
2964
  // Proxies
2965
+ rpc ProxyAddIp(ProxyAddIpRequest) returns (ProxyAddIpResponse);
2824
2966
  rpc ProxyCreate(ProxyCreateRequest) returns (ProxyCreateResponse);
2825
2967
  rpc ProxyDelete(ProxyDeleteRequest) returns (google.protobuf.Empty);
2826
2968
  rpc ProxyGet(ProxyGetRequest) returns (ProxyGetResponse);
2827
2969
  rpc ProxyGetOrCreate(ProxyGetOrCreateRequest) returns (ProxyGetOrCreateResponse);
2828
2970
  rpc ProxyList(google.protobuf.Empty) returns (ProxyListResponse);
2971
+ rpc ProxyRemoveIp(ProxyRemoveIpRequest) returns (google.protobuf.Empty);
2829
2972
 
2830
2973
  // Queues
2831
2974
  rpc QueueClear(QueueClearRequest) returns (google.protobuf.Empty);
@@ -2844,7 +2987,11 @@ service ModalClient {
2844
2987
  rpc SandboxGetTaskId(SandboxGetTaskIdRequest) returns (SandboxGetTaskIdResponse); // needed for modal container exec
2845
2988
  rpc SandboxGetTunnels(SandboxGetTunnelsRequest) returns (SandboxGetTunnelsResponse);
2846
2989
  rpc SandboxList(SandboxListRequest) returns (SandboxListResponse);
2990
+ rpc SandboxRestore(SandboxRestoreRequest) returns (SandboxRestoreResponse);
2991
+ rpc SandboxSnapshot(SandboxSnapshotRequest) returns (SandboxSnapshotResponse);
2992
+ rpc SandboxSnapshotFromId(SandboxSnapshotFromIdRequest) returns (SandboxSnapshotFromIdResponse);
2847
2993
  rpc SandboxSnapshotFs(SandboxSnapshotFsRequest) returns (SandboxSnapshotFsResponse);
2994
+ rpc SandboxSnapshotWait(SandboxSnapshotWaitRequest) returns (SandboxSnapshotWaitResponse);
2848
2995
  rpc SandboxStdinWrite(SandboxStdinWriteRequest) returns (SandboxStdinWriteResponse);
2849
2996
  rpc SandboxTagsSet(SandboxTagsSetRequest) returns (google.protobuf.Empty);
2850
2997
  rpc SandboxTerminate(SandboxTerminateRequest) returns (SandboxTerminateResponse);