modal 0.74.53__py3-none-any.whl → 0.74.55__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/_functions.py +6 -4
- modal/_utils/function_utils.py +3 -2
- modal/_utils/grpc_utils.py +33 -3
- modal/client.py +67 -37
- modal/client.pyi +28 -13
- modal/config.py +7 -2
- modal/parallel_map.py +1 -1
- modal/token_flow.py +9 -2
- modal/token_flow.pyi +1 -0
- {modal-0.74.53.dist-info → modal-0.74.55.dist-info}/METADATA +1 -1
- {modal-0.74.53.dist-info → modal-0.74.55.dist-info}/RECORD +17 -17
- modal_proto/modal_api_grpc.py +156 -150
- modal_version/_version_generated.py +1 -1
- {modal-0.74.53.dist-info → modal-0.74.55.dist-info}/WHEEL +0 -0
- {modal-0.74.53.dist-info → modal-0.74.55.dist-info}/entry_points.txt +0 -0
- {modal-0.74.53.dist-info → modal-0.74.55.dist-info}/licenses/LICENSE +0 -0
- {modal-0.74.53.dist-info → modal-0.74.55.dist-info}/top_level.txt +0 -0
modal/_functions.py
CHANGED
@@ -139,8 +139,10 @@ class _Invocation:
|
|
139
139
|
from_spawn_map: bool = False,
|
140
140
|
) -> "_Invocation":
|
141
141
|
assert client.stub
|
142
|
+
stub = client.stub
|
143
|
+
|
142
144
|
function_id = function.object_id
|
143
|
-
item = await _create_input(args, kwargs,
|
145
|
+
item = await _create_input(args, kwargs, stub, method_name=function._use_method_name)
|
144
146
|
|
145
147
|
request = api_pb2.FunctionMapRequest(
|
146
148
|
function_id=function_id,
|
@@ -181,7 +183,7 @@ class _Invocation:
|
|
181
183
|
item=item,
|
182
184
|
sync_client_retries_enabled=response.sync_client_retries_enabled,
|
183
185
|
)
|
184
|
-
return _Invocation(
|
186
|
+
return _Invocation(stub, function_call_id, client, retry_context)
|
185
187
|
|
186
188
|
request_put = api_pb2.FunctionPutInputsRequest(
|
187
189
|
function_id=function_id, inputs=[item], function_call_id=function_call_id
|
@@ -203,7 +205,7 @@ class _Invocation:
|
|
203
205
|
item=item,
|
204
206
|
sync_client_retries_enabled=response.sync_client_retries_enabled,
|
205
207
|
)
|
206
|
-
return _Invocation(
|
208
|
+
return _Invocation(stub, function_call_id, client, retry_context)
|
207
209
|
|
208
210
|
async def pop_function_call_outputs(
|
209
211
|
self, timeout: Optional[float], clear_on_success: bool, input_jwts: Optional[list[str]] = None
|
@@ -249,7 +251,7 @@ class _Invocation:
|
|
249
251
|
item = api_pb2.FunctionRetryInputsItem(input_jwt=ctx.input_jwt, input=ctx.item.input)
|
250
252
|
request = api_pb2.FunctionRetryInputsRequest(function_call_jwt=ctx.function_call_jwt, inputs=[item])
|
251
253
|
await retry_transient_errors(
|
252
|
-
self.
|
254
|
+
self.stub.FunctionRetryInputs,
|
253
255
|
request,
|
254
256
|
)
|
255
257
|
|
modal/_utils/function_utils.py
CHANGED
@@ -14,6 +14,7 @@ from synchronicity.exceptions import UserCodeException
|
|
14
14
|
|
15
15
|
import modal_proto
|
16
16
|
from modal_proto import api_pb2
|
17
|
+
from modal_proto.modal_api_grpc import ModalClientModal
|
17
18
|
|
18
19
|
from .._serialization import (
|
19
20
|
deserialize,
|
@@ -511,7 +512,7 @@ async def _process_result(result: api_pb2.GenericResult, data_format: int, stub,
|
|
511
512
|
|
512
513
|
|
513
514
|
async def _create_input(
|
514
|
-
args, kwargs,
|
515
|
+
args, kwargs, stub: ModalClientModal, *, idx: Optional[int] = None, method_name: Optional[str] = None
|
515
516
|
) -> api_pb2.FunctionPutInputsItem:
|
516
517
|
"""Serialize function arguments and create a FunctionInput protobuf,
|
517
518
|
uploading to blob storage if needed.
|
@@ -524,7 +525,7 @@ async def _create_input(
|
|
524
525
|
args_serialized = serialize((args, kwargs))
|
525
526
|
|
526
527
|
if len(args_serialized) > MAX_OBJECT_SIZE_BYTES:
|
527
|
-
args_blob_id = await blob_upload(args_serialized,
|
528
|
+
args_blob_id = await blob_upload(args_serialized, stub)
|
528
529
|
|
529
530
|
return api_pb2.FunctionPutInputsItem(
|
530
531
|
input=api_pb2.FunctionInput(
|
modal/_utils/grpc_utils.py
CHANGED
@@ -78,14 +78,44 @@ class RetryWarningMessage:
|
|
78
78
|
errors_to_warn_for: typing.List[Status]
|
79
79
|
|
80
80
|
|
81
|
+
class ConnectionManager:
|
82
|
+
"""ConnectionManager is a helper class for sharing connections to the Modal server.
|
83
|
+
|
84
|
+
It can create, cache, and close channels to the Modal server. This is useful since
|
85
|
+
multiple ModalClientModal stubs may target the same server URL, in which case they
|
86
|
+
should share the same connection.
|
87
|
+
"""
|
88
|
+
|
89
|
+
def __init__(self, client: "modal.client._Client", metadata: dict[str, str] = {}):
|
90
|
+
self._client = client
|
91
|
+
# Warning: This metadata is shared across all channels! If the metadata is mutated
|
92
|
+
# in one `create_channel` call, the mutation will be reflected in all channels.
|
93
|
+
self._metadata = metadata
|
94
|
+
self._channels: dict[str, grpclib.client.Channel] = {}
|
95
|
+
|
96
|
+
async def get_or_create_channel(self, server_url: str) -> grpclib.client.Channel:
|
97
|
+
if server_url not in self._channels:
|
98
|
+
self._channels[server_url] = create_channel(server_url, self._metadata)
|
99
|
+
try:
|
100
|
+
await connect_channel(self._channels[server_url])
|
101
|
+
except OSError as exc:
|
102
|
+
raise ConnectionError("Could not connect to the Modal server.") from exc
|
103
|
+
return self._channels[server_url]
|
104
|
+
|
105
|
+
def close(self):
|
106
|
+
for channel in self._channels.values():
|
107
|
+
channel.close()
|
108
|
+
self._channels.clear()
|
109
|
+
|
110
|
+
|
81
111
|
def create_channel(
|
82
112
|
server_url: str,
|
83
113
|
metadata: dict[str, str] = {},
|
84
114
|
) -> grpclib.client.Channel:
|
85
|
-
"""Creates a grpclib.Channel.
|
115
|
+
"""Creates a grpclib.Channel to be used by a GRPC stub.
|
86
116
|
|
87
|
-
|
88
|
-
|
117
|
+
Note that this function mutates the given metadata argument by adding an x-modal-auth-token
|
118
|
+
if one is present in the trailing metadata of any response.
|
89
119
|
"""
|
90
120
|
o = urllib.parse.urlparse(server_url)
|
91
121
|
|
modal/client.py
CHANGED
@@ -26,9 +26,9 @@ from modal_version import __version__
|
|
26
26
|
from ._traceback import print_server_warnings
|
27
27
|
from ._utils import async_utils
|
28
28
|
from ._utils.async_utils import TaskContext, synchronize_api
|
29
|
-
from ._utils.grpc_utils import
|
29
|
+
from ._utils.grpc_utils import ConnectionManager, retry_transient_errors
|
30
30
|
from .config import _check_config, _is_remote, config, logger
|
31
|
-
from .exception import AuthError, ClientClosed
|
31
|
+
from .exception import AuthError, ClientClosed
|
32
32
|
|
33
33
|
HEARTBEAT_INTERVAL: float = config.get("heartbeat_interval")
|
34
34
|
HEARTBEAT_TIMEOUT: float = HEARTBEAT_INTERVAL + 0.1
|
@@ -94,7 +94,6 @@ class _Client:
|
|
94
94
|
self._credentials = credentials
|
95
95
|
self.version = version
|
96
96
|
self._closed = False
|
97
|
-
self._channel: Optional[grpclib.client.Channel] = None
|
98
97
|
self._stub: Optional[modal_api_grpc.ModalClientModal] = None
|
99
98
|
self._snapshotted = False
|
100
99
|
self._owner_pid = None
|
@@ -104,10 +103,28 @@ class _Client:
|
|
104
103
|
|
105
104
|
@property
|
106
105
|
def stub(self) -> modal_api_grpc.ModalClientModal:
|
107
|
-
"""mdmd:hidden
|
106
|
+
"""mdmd:hidden
|
107
|
+
The default stub. Stubs can safely be used across forks / client snapshots.
|
108
|
+
|
109
|
+
This is useful if you want to make requests to the default Modal server in us-east, for example
|
110
|
+
control plane requests.
|
111
|
+
|
112
|
+
This is equivalent to client.get_stub(default_server_url), but it's cached, so it's a bit faster.
|
113
|
+
"""
|
108
114
|
assert self._stub
|
109
115
|
return self._stub
|
110
116
|
|
117
|
+
async def get_stub(self, server_url: str) -> modal_api_grpc.ModalClientModal:
|
118
|
+
"""mdmd:hidden
|
119
|
+
Get a stub for a specific server URL. Stubs can safely be used across forks / client snapshots.
|
120
|
+
|
121
|
+
This is useful if you want to make requests to a regional Modal server, for example low-latency
|
122
|
+
function calls in us-west.
|
123
|
+
|
124
|
+
This function is O(n) where n is the number of RPCs in ModalClient.
|
125
|
+
"""
|
126
|
+
return await modal_api_grpc.ModalClientModal._create(self, server_url)
|
127
|
+
|
111
128
|
async def _open(self):
|
112
129
|
self._closed = False
|
113
130
|
assert self._stub is None
|
@@ -115,13 +132,9 @@ class _Client:
|
|
115
132
|
self._cancellation_context = TaskContext(grace=0.5) # allow running rpcs to finish in 0.5s when closing client
|
116
133
|
self._cancellation_context_event_loop = asyncio.get_running_loop()
|
117
134
|
await self._cancellation_context.__aenter__()
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
except OSError as exc:
|
122
|
-
raise ConnectionError("Could not connect to the Modal server.") from exc
|
123
|
-
self._grpclib_stub = api_grpc.ModalClientStub(self._channel)
|
124
|
-
self._stub = modal_api_grpc.ModalClientModal(self._grpclib_stub, client=self)
|
135
|
+
|
136
|
+
self._connection_manager = ConnectionManager(client=self, metadata=metadata)
|
137
|
+
self._stub = await self.get_stub(self.server_url)
|
125
138
|
self._owner_pid = os.getpid()
|
126
139
|
|
127
140
|
async def _close(self, prep_for_restore: bool = False):
|
@@ -129,8 +142,8 @@ class _Client:
|
|
129
142
|
self._closed = True
|
130
143
|
if hasattr(self, "_cancellation_context"):
|
131
144
|
await self._cancellation_context.__aexit__(None, None, None) # wait for all rpcs to be finished/cancelled
|
132
|
-
if self.
|
133
|
-
self.
|
145
|
+
if self._connection_manager:
|
146
|
+
self._connection_manager.close()
|
134
147
|
|
135
148
|
if prep_for_restore:
|
136
149
|
self._snapshotted = True
|
@@ -284,43 +297,40 @@ class _Client:
|
|
284
297
|
if self._owner_pid and self._owner_pid != os.getpid():
|
285
298
|
# not calling .close() since that would also interact with stale resources
|
286
299
|
# just reset the internal state
|
287
|
-
self.
|
300
|
+
self._connection_manager = None
|
288
301
|
self._stub = None
|
289
|
-
self._grpclib_stub = None
|
290
302
|
self._owner_pid = None
|
291
303
|
|
292
304
|
self.set_env_client(None)
|
293
305
|
# TODO(elias): reset _cancellation_context in case ?
|
294
306
|
await self._open()
|
295
307
|
|
296
|
-
async def
|
297
|
-
#
|
298
|
-
# This prevents usage of stale
|
308
|
+
async def _get_channel(self, server_url: str) -> grpclib.client.Channel:
|
309
|
+
# Get a valid grpclib channel, reusing existing channels if possible.
|
310
|
+
# This prevents usage of stale channels across forks of processes.
|
299
311
|
await self._reset_on_pid_change()
|
300
|
-
return
|
312
|
+
return await self._connection_manager.get_or_create_channel(server_url)
|
301
313
|
|
302
314
|
@synchronizer.nowrap
|
303
315
|
async def _call_unary(
|
304
316
|
self,
|
305
|
-
|
317
|
+
grpclib_method: grpclib.client.UnaryUnaryMethod[RequestType, ResponseType],
|
306
318
|
request: Any,
|
307
319
|
*,
|
308
320
|
timeout: Optional[float] = None,
|
309
321
|
metadata: Optional[_MetadataLike] = None,
|
310
322
|
) -> Any:
|
311
|
-
grpclib_method = await self._get_grpclib_method(method_name)
|
312
323
|
coro = grpclib_method(request, timeout=timeout, metadata=metadata)
|
313
324
|
return await self._call_safely(coro, grpclib_method.name)
|
314
325
|
|
315
326
|
@synchronizer.nowrap
|
316
327
|
async def _call_stream(
|
317
328
|
self,
|
318
|
-
|
329
|
+
grpclib_method: grpclib.client.UnaryStreamMethod[RequestType, ResponseType],
|
319
330
|
request: Any,
|
320
331
|
*,
|
321
332
|
metadata: Optional[_MetadataLike],
|
322
333
|
) -> AsyncGenerator[Any, None]:
|
323
|
-
grpclib_method = await self._get_grpclib_method(method_name)
|
324
334
|
stream_context = grpclib_method.open(metadata=metadata)
|
325
335
|
stream = await self._call_safely(stream_context.__aenter__(), f"{grpclib_method.name}.open")
|
326
336
|
try:
|
@@ -347,16 +357,19 @@ class UnaryUnaryWrapper(Generic[RequestType, ResponseType]):
|
|
347
357
|
wrapped_method: grpclib.client.UnaryUnaryMethod[RequestType, ResponseType]
|
348
358
|
client: _Client
|
349
359
|
|
350
|
-
def __init__(
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
360
|
+
def __init__(
|
361
|
+
self,
|
362
|
+
wrapped_method: grpclib.client.UnaryUnaryMethod[RequestType, ResponseType],
|
363
|
+
client: _Client,
|
364
|
+
server_url: str,
|
365
|
+
):
|
366
|
+
self.wrapped_method = wrapped_method
|
355
367
|
self.client = client
|
368
|
+
self.server_url = server_url
|
356
369
|
|
357
370
|
@property
|
358
371
|
def name(self) -> str:
|
359
|
-
return self.
|
372
|
+
return self.wrapped_method.name
|
360
373
|
|
361
374
|
async def __call__(
|
362
375
|
self,
|
@@ -366,22 +379,38 @@ class UnaryUnaryWrapper(Generic[RequestType, ResponseType]):
|
|
366
379
|
metadata: Optional[_MetadataLike] = None,
|
367
380
|
) -> ResponseType:
|
368
381
|
if self.client._snapshotted:
|
369
|
-
logger.debug(f"refreshing client after snapshot for {self.
|
382
|
+
logger.debug(f"refreshing client after snapshot for {self.name.rsplit('/', 1)[1]}")
|
370
383
|
self.client = await _Client.from_env()
|
371
|
-
|
384
|
+
|
385
|
+
# Note: We override the grpclib method's channel (see grpclib's code [1]). I think this is fine
|
386
|
+
# since grpclib's code doesn't seem to change very much, but we could also recreate the
|
387
|
+
# grpclib stub if we aren't comfortable with this. The downside is then we need to cache
|
388
|
+
# the grpclib stub so the rest of our code becomes a bit more complicated.
|
389
|
+
#
|
390
|
+
# We need to override the channel because after the process is forked or the client is
|
391
|
+
# snapshotted, the existing channel may be stale / unusable.
|
392
|
+
#
|
393
|
+
# [1]: https://github.com/vmagamedov/grpclib/blob/62f968a4c84e3f64e6966097574ff0a59969ea9b/grpclib/client.py#L844
|
394
|
+
self.wrapped_method.channel = await self.client._get_channel(self.server_url)
|
395
|
+
return await self.client._call_unary(self.wrapped_method, req, timeout=timeout, metadata=metadata)
|
372
396
|
|
373
397
|
|
374
398
|
class UnaryStreamWrapper(Generic[RequestType, ResponseType]):
|
375
399
|
wrapped_method: grpclib.client.UnaryStreamMethod[RequestType, ResponseType]
|
376
400
|
|
377
|
-
def __init__(
|
378
|
-
self
|
379
|
-
|
401
|
+
def __init__(
|
402
|
+
self,
|
403
|
+
wrapped_method: grpclib.client.UnaryStreamMethod[RequestType, ResponseType],
|
404
|
+
client: _Client,
|
405
|
+
server_url: str,
|
406
|
+
):
|
407
|
+
self.wrapped_method = wrapped_method
|
380
408
|
self.client = client
|
409
|
+
self.server_url = server_url
|
381
410
|
|
382
411
|
@property
|
383
412
|
def name(self) -> str:
|
384
|
-
return self.
|
413
|
+
return self.wrapped_method.name
|
385
414
|
|
386
415
|
async def unary_stream(
|
387
416
|
self,
|
@@ -389,7 +418,8 @@ class UnaryStreamWrapper(Generic[RequestType, ResponseType]):
|
|
389
418
|
metadata: Optional[Any] = None,
|
390
419
|
):
|
391
420
|
if self.client._snapshotted:
|
392
|
-
logger.debug(f"refreshing client after snapshot for {self.
|
421
|
+
logger.debug(f"refreshing client after snapshot for {self.name.rsplit('/', 1)[1]}")
|
393
422
|
self.client = await _Client.from_env()
|
394
|
-
|
423
|
+
self.wrapped_method.channel = await self.client._get_channel(self.server_url)
|
424
|
+
async for response in self.client._call_stream(self.wrapped_method, request, metadata=metadata):
|
395
425
|
yield response
|
modal/client.pyi
CHANGED
@@ -27,11 +27,12 @@ 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.55"
|
31
31
|
): ...
|
32
32
|
def is_closed(self) -> bool: ...
|
33
33
|
@property
|
34
34
|
def stub(self) -> modal_proto.modal_api_grpc.ModalClientModal: ...
|
35
|
+
async def get_stub(self, server_url: str) -> modal_proto.modal_api_grpc.ModalClientModal: ...
|
35
36
|
async def _open(self): ...
|
36
37
|
async def _close(self, prep_for_restore: bool = False): ...
|
37
38
|
async def hello(self): ...
|
@@ -49,10 +50,10 @@ class _Client:
|
|
49
50
|
def set_env_client(cls, client: typing.Optional[_Client]): ...
|
50
51
|
async def _call_safely(self, coro, readable_method: str): ...
|
51
52
|
async def _reset_on_pid_change(self): ...
|
52
|
-
async def
|
53
|
+
async def _get_channel(self, server_url: str) -> grpclib.client.Channel: ...
|
53
54
|
async def _call_unary(
|
54
55
|
self,
|
55
|
-
|
56
|
+
grpclib_method: grpclib.client.UnaryUnaryMethod[RequestType, ResponseType],
|
56
57
|
request: typing.Any,
|
57
58
|
*,
|
58
59
|
timeout: typing.Optional[float] = None,
|
@@ -64,7 +65,7 @@ class _Client:
|
|
64
65
|
) -> typing.Any: ...
|
65
66
|
def _call_stream(
|
66
67
|
self,
|
67
|
-
|
68
|
+
grpclib_method: grpclib.client.UnaryStreamMethod[RequestType, ResponseType],
|
68
69
|
request: typing.Any,
|
69
70
|
*,
|
70
71
|
metadata: typing.Union[
|
@@ -85,12 +86,18 @@ class Client:
|
|
85
86
|
_snapshotted: bool
|
86
87
|
|
87
88
|
def __init__(
|
88
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.
|
89
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.55"
|
89
90
|
): ...
|
90
91
|
def is_closed(self) -> bool: ...
|
91
92
|
@property
|
92
93
|
def stub(self) -> modal_proto.modal_api_grpc.ModalClientModal: ...
|
93
94
|
|
95
|
+
class __get_stub_spec(typing_extensions.Protocol[SUPERSELF]):
|
96
|
+
def __call__(self, server_url: str) -> modal_proto.modal_api_grpc.ModalClientModal: ...
|
97
|
+
async def aio(self, server_url: str) -> modal_proto.modal_api_grpc.ModalClientModal: ...
|
98
|
+
|
99
|
+
get_stub: __get_stub_spec[typing_extensions.Self]
|
100
|
+
|
94
101
|
class ___open_spec(typing_extensions.Protocol[SUPERSELF]):
|
95
102
|
def __call__(self): ...
|
96
103
|
async def aio(self): ...
|
@@ -136,15 +143,15 @@ class Client:
|
|
136
143
|
|
137
144
|
_reset_on_pid_change: ___reset_on_pid_change_spec[typing_extensions.Self]
|
138
145
|
|
139
|
-
class
|
140
|
-
def __call__(self,
|
141
|
-
async def aio(self,
|
146
|
+
class ___get_channel_spec(typing_extensions.Protocol[SUPERSELF]):
|
147
|
+
def __call__(self, server_url: str) -> grpclib.client.Channel: ...
|
148
|
+
async def aio(self, server_url: str) -> grpclib.client.Channel: ...
|
142
149
|
|
143
|
-
|
150
|
+
_get_channel: ___get_channel_spec[typing_extensions.Self]
|
144
151
|
|
145
152
|
async def _call_unary(
|
146
153
|
self,
|
147
|
-
|
154
|
+
grpclib_method: grpclib.client.UnaryUnaryMethod[RequestType, ResponseType],
|
148
155
|
request: typing.Any,
|
149
156
|
*,
|
150
157
|
timeout: typing.Optional[float] = None,
|
@@ -156,7 +163,7 @@ class Client:
|
|
156
163
|
) -> typing.Any: ...
|
157
164
|
def _call_stream(
|
158
165
|
self,
|
159
|
-
|
166
|
+
grpclib_method: grpclib.client.UnaryStreamMethod[RequestType, ResponseType],
|
160
167
|
request: typing.Any,
|
161
168
|
*,
|
162
169
|
metadata: typing.Union[
|
@@ -170,7 +177,12 @@ class UnaryUnaryWrapper(typing.Generic[RequestType, ResponseType]):
|
|
170
177
|
wrapped_method: grpclib.client.UnaryUnaryMethod[RequestType, ResponseType]
|
171
178
|
client: _Client
|
172
179
|
|
173
|
-
def __init__(
|
180
|
+
def __init__(
|
181
|
+
self,
|
182
|
+
wrapped_method: grpclib.client.UnaryUnaryMethod[RequestType, ResponseType],
|
183
|
+
client: _Client,
|
184
|
+
server_url: str,
|
185
|
+
): ...
|
174
186
|
@property
|
175
187
|
def name(self) -> str: ...
|
176
188
|
async def __call__(
|
@@ -189,7 +201,10 @@ class UnaryStreamWrapper(typing.Generic[RequestType, ResponseType]):
|
|
189
201
|
wrapped_method: grpclib.client.UnaryStreamMethod[RequestType, ResponseType]
|
190
202
|
|
191
203
|
def __init__(
|
192
|
-
self,
|
204
|
+
self,
|
205
|
+
wrapped_method: grpclib.client.UnaryStreamMethod[RequestType, ResponseType],
|
206
|
+
client: _Client,
|
207
|
+
server_url: str,
|
193
208
|
): ...
|
194
209
|
@property
|
195
210
|
def name(self) -> str: ...
|
modal/config.py
CHANGED
@@ -102,6 +102,9 @@ from ._utils.deprecation import deprecation_error
|
|
102
102
|
from ._utils.logger import configure_logger
|
103
103
|
from .exception import InvalidError
|
104
104
|
|
105
|
+
DEFAULT_SERVER_URL = "https://api.modal.com"
|
106
|
+
|
107
|
+
|
105
108
|
# Locate config file and read it
|
106
109
|
|
107
110
|
user_config_path: str = os.environ.get("MODAL_CONFIG_PATH") or os.path.expanduser("~/.modal.toml")
|
@@ -222,7 +225,7 @@ _SETTINGS = {
|
|
222
225
|
"loglevel": _Setting("WARNING", lambda s: s.upper()),
|
223
226
|
"log_format": _Setting("STRING", lambda s: s.upper()),
|
224
227
|
"log_pattern": _Setting(), # optional override of the formatting pattern
|
225
|
-
"server_url": _Setting(
|
228
|
+
"server_url": _Setting(DEFAULT_SERVER_URL),
|
226
229
|
"token_id": _Setting(),
|
227
230
|
"token_secret": _Setting(),
|
228
231
|
"task_id": _Setting(),
|
@@ -316,7 +319,9 @@ configure_logger(logger, config["loglevel"], config["log_format"])
|
|
316
319
|
|
317
320
|
|
318
321
|
def _store_user_config(
|
319
|
-
new_settings: dict[str, Any],
|
322
|
+
new_settings: dict[str, Any],
|
323
|
+
profile: Optional[str] = None,
|
324
|
+
active_profile: Optional[str] = None,
|
320
325
|
):
|
321
326
|
"""Internal method, used by the CLI to set tokens."""
|
322
327
|
if profile is None:
|
modal/parallel_map.py
CHANGED
@@ -138,7 +138,7 @@ async def _map_invocation(
|
|
138
138
|
idx = inputs_created
|
139
139
|
inputs_created += 1
|
140
140
|
(args, kwargs) = argskwargs
|
141
|
-
return await _create_input(args, kwargs, client, idx=idx, method_name=function._use_method_name)
|
141
|
+
return await _create_input(args, kwargs, client.stub, idx=idx, method_name=function._use_method_name)
|
142
142
|
|
143
143
|
async def input_iter():
|
144
144
|
while 1:
|
modal/token_flow.py
CHANGED
@@ -14,7 +14,7 @@ from modal_proto import api_pb2
|
|
14
14
|
from ._utils.async_utils import synchronize_api
|
15
15
|
from ._utils.http_utils import run_temporary_http_server
|
16
16
|
from .client import _Client
|
17
|
-
from .config import _lookup_workspace, _store_user_config, config, config_profiles, user_config_path
|
17
|
+
from .config import DEFAULT_SERVER_URL, _lookup_workspace, _store_user_config, config, config_profiles, user_config_path
|
18
18
|
from .exception import AuthError
|
19
19
|
|
20
20
|
|
@@ -108,6 +108,8 @@ async def _new_token(
|
|
108
108
|
|
109
109
|
console.print("[green]Web authentication finished successfully![/green]")
|
110
110
|
|
111
|
+
server_url = client.server_url
|
112
|
+
|
111
113
|
assert result is not None
|
112
114
|
|
113
115
|
if result.workspace_username:
|
@@ -115,7 +117,9 @@ async def _new_token(
|
|
115
117
|
f"[green]Token is connected to the [magenta]{result.workspace_username}[/magenta] workspace.[/green]"
|
116
118
|
)
|
117
119
|
|
118
|
-
await _set_token(
|
120
|
+
await _set_token(
|
121
|
+
result.token_id, result.token_secret, profile=profile, activate=activate, verify=verify, server_url=server_url
|
122
|
+
)
|
119
123
|
|
120
124
|
|
121
125
|
async def _set_token(
|
@@ -125,6 +129,7 @@ async def _set_token(
|
|
125
129
|
profile: Optional[str] = None,
|
126
130
|
activate: bool = True,
|
127
131
|
verify: bool = True,
|
132
|
+
server_url: Optional[str] = None,
|
128
133
|
):
|
129
134
|
# TODO add server_url as a parameter for verification?
|
130
135
|
server_url = config.get("server_url", profile=profile)
|
@@ -149,6 +154,8 @@ async def _set_token(
|
|
149
154
|
profile = workspace.username
|
150
155
|
|
151
156
|
config_data = {"token_id": token_id, "token_secret": token_secret}
|
157
|
+
if server_url is not None and server_url != DEFAULT_SERVER_URL:
|
158
|
+
config_data["server_url"] = server_url
|
152
159
|
# Activate the profile when requested or if no other profiles currently exist
|
153
160
|
active_profile = profile if (activate or not config_profiles()) else None
|
154
161
|
with console.status("Storing token", spinner="dots"):
|
modal/token_flow.pyi
CHANGED
@@ -3,7 +3,7 @@ modal/__main__.py,sha256=sTJcc9EbDuCKSwg3tL6ZckFw9WWdlkXW8mId1IvJCNc,2846
|
|
3
3
|
modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
|
4
4
|
modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
|
5
5
|
modal/_container_entrypoint.py,sha256=2Zx9O_EMJg0H77EdnC2vGKs6uFMWwbP1NLFf-qYmWmU,28962
|
6
|
-
modal/_functions.py,sha256=
|
6
|
+
modal/_functions.py,sha256=XouGO1IvJA3qSmjwZYt6i-dZxH-FJkfhwVJp4o_0j1s,77679
|
7
7
|
modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
|
8
8
|
modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
|
9
9
|
modal/_object.py,sha256=6ve4sI2nRAnjPCuAXdSoUplaXfzC9MqRlF_ZLULwwy0,11472
|
@@ -21,13 +21,13 @@ modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
|
|
21
21
|
modal/app.py,sha256=r-9vVU1lrR1CWtJEo60fuaianvxY_oOXZyv1Qx1DEkI,51231
|
22
22
|
modal/app.pyi,sha256=0QNtnUpAFbOPcbwCt119ge7OmoBqMFw5SajLgdE5eOw,28600
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
|
-
modal/client.py,sha256=
|
25
|
-
modal/client.pyi,sha256=
|
24
|
+
modal/client.py,sha256=o-aQThHpvDHUzg_kUafyhWzACViUBhY2WLZ2EitnSHA,16787
|
25
|
+
modal/client.pyi,sha256=9fUzrcuA2uqCuRxHuIZxhsTR-lopTQuKxs_VvusFdLY,8343
|
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=aHoMEWMZUN7bOezs3tRPxzS1FP3gTxZBORVjbPmtxyg,35338
|
29
29
|
modal/cls.pyi,sha256=B--Y4xEOo3GRE3QiiFdIE8jnIKEeBcOtwAbXvg2Z8H4,12012
|
30
|
-
modal/config.py,sha256=
|
30
|
+
modal/config.py,sha256=OOMEJ5LHNFbHRW5wUpuhl0TH6EPW8D1XV9I3OJXrZrk,12668
|
31
31
|
modal/container_process.py,sha256=vvyK3DVPUMsuqvkKdUiQ49cDLF9JawGrxpglLk5vfgI,6208
|
32
32
|
modal/container_process.pyi,sha256=bXs2KHe7nxVuLAm6RRBqXCvDKelANGX9gFY8qIuZYDs,2898
|
33
33
|
modal/dict.py,sha256=7NJVI05hisF9gTuJMYestH9X0LIOaE9PPqbCeYtwSRs,13365
|
@@ -52,7 +52,7 @@ modal/network_file_system.pyi,sha256=C_ZiXmpdkTObapVhAPlRmB4ofmM2D7SdKlUCZVg-1IQ
|
|
52
52
|
modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
|
53
53
|
modal/object.pyi,sha256=kyJkRQcVv3ct7zSAxvvXcuhBVeH914v80uSlqeS7cA4,5632
|
54
54
|
modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
|
55
|
-
modal/parallel_map.py,sha256=
|
55
|
+
modal/parallel_map.py,sha256=ZOzjgCBcXv4gyOmEsLPVRkji1r2yqPIsP4Diw7G0hWI,35694
|
56
56
|
modal/parallel_map.pyi,sha256=bLh_D57e5KOIkmP4WW-C_rMSzfxRUNfdtpNJKj4jWA4,5865
|
57
57
|
modal/partial_function.py,sha256=SwuAAj2wj4SO6F6nkSnwNZrczEmm9w9YdlQTHh6hr04,1195
|
58
58
|
modal/partial_function.pyi,sha256=NFWz1aCAs2B3-GnPf1cTatWRZOLnYpFKCnjP_X9iNRs,6411
|
@@ -76,8 +76,8 @@ modal/serving.pyi,sha256=KGSaZhg0qwygLmDkhgJedUfWeNSkXsyoOipq10vYffU,1978
|
|
76
76
|
modal/snapshot.py,sha256=6rQvDP3iX9hdiAudKTy0-m0JESt4kk0q2gusXbaRA-8,1279
|
77
77
|
modal/snapshot.pyi,sha256=Ypd4NKsjOTnnnqXyTGGLKq5lkocRrUURYjY5Pi67_qA,670
|
78
78
|
modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
|
79
|
-
modal/token_flow.py,sha256=
|
80
|
-
modal/token_flow.pyi,sha256=
|
79
|
+
modal/token_flow.py,sha256=0_4KabXKsuE4OXTJ1OuLOtA-b1sesShztMZkkRFK7tA,7605
|
80
|
+
modal/token_flow.pyi,sha256=7WBDuk9l_VNLxUwr6zDZg2gLyujTiGlAkjmjPV_7FWc,2109
|
81
81
|
modal/volume.py,sha256=d8x6i2qJgacJQ5qbNMvzeNFrK7ap4jPtjxZEpWstpCw,40624
|
82
82
|
modal/volume.pyi,sha256=rjlkEt9zuCy7GLe1TuVDSTiGJliFX9v6_KGKqL8HaeM,18760
|
83
83
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
@@ -96,10 +96,10 @@ modal/_utils/blob_utils.py,sha256=IexC2Jbtqp_Tkmy62ayfgzTYte0UPCNufB_v-DO21g8,18
|
|
96
96
|
modal/_utils/bytes_io_segment_payload.py,sha256=uunxVJS4PE1LojF_UpURMzVK9GuvmYWRqQo_bxEj5TU,3385
|
97
97
|
modal/_utils/deprecation.py,sha256=EXP1beU4pmEqEzWMLw6E3kUfNfpmNA_VOp6i0EHi93g,4856
|
98
98
|
modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
|
99
|
-
modal/_utils/function_utils.py,sha256=
|
99
|
+
modal/_utils/function_utils.py,sha256=KNoFx_DBtfw3QMB8V_HPDcj4GylnI3tuf7RKPF2T3-I,27342
|
100
100
|
modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
|
101
101
|
modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
|
102
|
-
modal/_utils/grpc_utils.py,sha256=
|
102
|
+
modal/_utils/grpc_utils.py,sha256=Op0D25Z3WOogoo1ZPKc4zOco1IWckJCfq_QOxfkzroI,10599
|
103
103
|
modal/_utils/hash_utils.py,sha256=zg3J6OGxTFGSFri1qQ12giDz90lWk8bzaxCTUCRtiX4,3034
|
104
104
|
modal/_utils/http_utils.py,sha256=yeTFsXYr0rYMEhB7vBP7audG9Uc7OLhzKBANFDZWVt0,2451
|
105
105
|
modal/_utils/jwt_utils.py,sha256=fxH9plyrbAemTbjSsQtzIdDXE9QXxvMC4DiUZ16G0aA,1360
|
@@ -145,7 +145,7 @@ 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.55.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
151
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
@@ -159,7 +159,7 @@ modal_proto/api_pb2.py,sha256=EWWs8G_DH4ezUzsNSCRiYCW7TV3J9pM3NDtdcR1N9YA,332519
|
|
159
159
|
modal_proto/api_pb2.pyi,sha256=K05tcHYkl_ZFGK_mfFOxjJ2V1SryTpCng6CkeqOAA0Q,452511
|
160
160
|
modal_proto/api_pb2_grpc.py,sha256=-KPQMzXmTYwgF23_tGpODCVK79iOdV1sRsw5mN-byMw,247448
|
161
161
|
modal_proto/api_pb2_grpc.pyi,sha256=ls1qcby7goTrlE6BluSWpo73cW_ajvh3rOe41azMBWM,57929
|
162
|
-
modal_proto/modal_api_grpc.py,sha256=
|
162
|
+
modal_proto/modal_api_grpc.py,sha256=eoJvCFelooz_mlLa1sJ5CEsNuUSIui-4aUgSmiCwKOI,17312
|
163
163
|
modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
|
164
164
|
modal_proto/options.proto,sha256=zp9h5r61ivsp0XwEWwNBsVqNTbRA1VSY_UtN7sEcHtE,549
|
165
165
|
modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
|
@@ -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=OZ_XmoTkO3MCoksyO8lR_vFkMH1zV93AgoruWFvLPis,149
|
174
|
+
modal-0.74.55.dist-info/METADATA,sha256=oCE7_7EOAb5XgRznncfj2CpEJmlHutoa2JPOv9cDg_I,2451
|
175
|
+
modal-0.74.55.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
176
|
+
modal-0.74.55.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
177
|
+
modal-0.74.55.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
178
|
+
modal-0.74.55.dist-info/RECORD,,
|
modal_proto/modal_api_grpc.py
CHANGED
@@ -10,154 +10,160 @@ if typing.TYPE_CHECKING:
|
|
10
10
|
|
11
11
|
|
12
12
|
class ModalClientModal:
|
13
|
+
@classmethod
|
14
|
+
async def _create(cls, client: 'modal.client._Client', server_url: str):
|
15
|
+
channel = await client._get_channel(server_url)
|
16
|
+
grpclib_stub = modal_proto.api_grpc.ModalClientStub(channel)
|
17
|
+
return cls(grpclib_stub, client, server_url)
|
13
18
|
|
14
|
-
|
15
|
-
|
16
|
-
self.
|
17
|
-
self.
|
18
|
-
self.
|
19
|
-
self.
|
20
|
-
self.
|
21
|
-
self.
|
22
|
-
self.
|
23
|
-
self.
|
24
|
-
self.
|
25
|
-
self.
|
26
|
-
self.
|
27
|
-
self.
|
28
|
-
self.
|
29
|
-
self.
|
30
|
-
self.
|
31
|
-
self.
|
32
|
-
self.
|
33
|
-
self.
|
34
|
-
self.
|
35
|
-
self.
|
36
|
-
self.
|
37
|
-
self.
|
38
|
-
self.
|
39
|
-
self.
|
40
|
-
self.
|
41
|
-
self.
|
42
|
-
self.
|
43
|
-
self.
|
44
|
-
self.
|
45
|
-
self.
|
46
|
-
self.
|
47
|
-
self.
|
48
|
-
self.
|
49
|
-
self.
|
50
|
-
self.
|
51
|
-
self.
|
52
|
-
self.
|
53
|
-
self.
|
54
|
-
self.
|
55
|
-
self.
|
56
|
-
self.
|
57
|
-
self.
|
58
|
-
self.
|
59
|
-
self.
|
60
|
-
self.
|
61
|
-
self.
|
62
|
-
self.
|
63
|
-
self.
|
64
|
-
self.
|
65
|
-
self.
|
66
|
-
self.
|
67
|
-
self.
|
68
|
-
self.
|
69
|
-
self.
|
70
|
-
self.
|
71
|
-
self.
|
72
|
-
self.
|
73
|
-
self.
|
74
|
-
self.
|
75
|
-
self.
|
76
|
-
self.
|
77
|
-
self.
|
78
|
-
self.
|
79
|
-
self.
|
80
|
-
self.
|
81
|
-
self.
|
82
|
-
self.
|
83
|
-
self.
|
84
|
-
self.
|
85
|
-
self.
|
86
|
-
self.
|
87
|
-
self.
|
88
|
-
self.
|
89
|
-
self.
|
90
|
-
self.
|
91
|
-
self.
|
92
|
-
self.
|
93
|
-
self.
|
94
|
-
self.
|
95
|
-
self.
|
96
|
-
self.
|
97
|
-
self.
|
98
|
-
self.
|
99
|
-
self.
|
100
|
-
self.
|
101
|
-
self.
|
102
|
-
self.
|
103
|
-
self.
|
104
|
-
self.
|
105
|
-
self.
|
106
|
-
self.
|
107
|
-
self.
|
108
|
-
self.
|
109
|
-
self.
|
110
|
-
self.
|
111
|
-
self.
|
112
|
-
self.
|
113
|
-
self.
|
114
|
-
self.
|
115
|
-
self.
|
116
|
-
self.
|
117
|
-
self.
|
118
|
-
self.
|
119
|
-
self.
|
120
|
-
self.
|
121
|
-
self.
|
122
|
-
self.
|
123
|
-
self.
|
124
|
-
self.
|
125
|
-
self.
|
126
|
-
self.
|
127
|
-
self.
|
128
|
-
self.
|
129
|
-
self.
|
130
|
-
self.
|
131
|
-
self.
|
132
|
-
self.
|
133
|
-
self.
|
134
|
-
self.
|
135
|
-
self.
|
136
|
-
self.
|
137
|
-
self.
|
138
|
-
self.
|
139
|
-
self.
|
140
|
-
self.
|
141
|
-
self.
|
142
|
-
self.
|
143
|
-
self.
|
144
|
-
self.
|
145
|
-
self.
|
146
|
-
self.
|
147
|
-
self.
|
148
|
-
self.
|
149
|
-
self.
|
150
|
-
self.
|
151
|
-
self.
|
152
|
-
self.
|
153
|
-
self.
|
154
|
-
self.
|
155
|
-
self.
|
156
|
-
self.
|
157
|
-
self.
|
158
|
-
self.
|
159
|
-
self.
|
160
|
-
self.
|
161
|
-
self.
|
162
|
-
self.
|
163
|
-
self.
|
19
|
+
|
20
|
+
def __init__(self, grpclib_stub: modal_proto.api_grpc.ModalClientStub, client: "modal.client._Client", server_url: str) -> None:
|
21
|
+
self.AppClientDisconnect = modal.client.UnaryUnaryWrapper(grpclib_stub.AppClientDisconnect, client, server_url)
|
22
|
+
self.AppCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.AppCreate, client, server_url)
|
23
|
+
self.AppDeploy = modal.client.UnaryUnaryWrapper(grpclib_stub.AppDeploy, client, server_url)
|
24
|
+
self.AppDeploymentHistory = modal.client.UnaryUnaryWrapper(grpclib_stub.AppDeploymentHistory, client, server_url)
|
25
|
+
self.AppGetByDeploymentName = modal.client.UnaryUnaryWrapper(grpclib_stub.AppGetByDeploymentName, client, server_url)
|
26
|
+
self.AppGetLayout = modal.client.UnaryUnaryWrapper(grpclib_stub.AppGetLayout, client, server_url)
|
27
|
+
self.AppGetLogs = modal.client.UnaryStreamWrapper(grpclib_stub.AppGetLogs, client, server_url)
|
28
|
+
self.AppGetObjects = modal.client.UnaryUnaryWrapper(grpclib_stub.AppGetObjects, client, server_url)
|
29
|
+
self.AppGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.AppGetOrCreate, client, server_url)
|
30
|
+
self.AppHeartbeat = modal.client.UnaryUnaryWrapper(grpclib_stub.AppHeartbeat, client, server_url)
|
31
|
+
self.AppList = modal.client.UnaryUnaryWrapper(grpclib_stub.AppList, client, server_url)
|
32
|
+
self.AppLookup = modal.client.UnaryUnaryWrapper(grpclib_stub.AppLookup, client, server_url)
|
33
|
+
self.AppPublish = modal.client.UnaryUnaryWrapper(grpclib_stub.AppPublish, client, server_url)
|
34
|
+
self.AppRollback = modal.client.UnaryUnaryWrapper(grpclib_stub.AppRollback, client, server_url)
|
35
|
+
self.AppSetObjects = modal.client.UnaryUnaryWrapper(grpclib_stub.AppSetObjects, client, server_url)
|
36
|
+
self.AppStop = modal.client.UnaryUnaryWrapper(grpclib_stub.AppStop, client, server_url)
|
37
|
+
self.AttemptAwait = modal.client.UnaryUnaryWrapper(grpclib_stub.AttemptAwait, client, server_url)
|
38
|
+
self.AttemptStart = modal.client.UnaryUnaryWrapper(grpclib_stub.AttemptStart, client, server_url)
|
39
|
+
self.BlobCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.BlobCreate, client, server_url)
|
40
|
+
self.BlobGet = modal.client.UnaryUnaryWrapper(grpclib_stub.BlobGet, client, server_url)
|
41
|
+
self.ClassCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.ClassCreate, client, server_url)
|
42
|
+
self.ClassGet = modal.client.UnaryUnaryWrapper(grpclib_stub.ClassGet, client, server_url)
|
43
|
+
self.ClientHello = modal.client.UnaryUnaryWrapper(grpclib_stub.ClientHello, client, server_url)
|
44
|
+
self.ClusterGet = modal.client.UnaryUnaryWrapper(grpclib_stub.ClusterGet, client, server_url)
|
45
|
+
self.ClusterList = modal.client.UnaryUnaryWrapper(grpclib_stub.ClusterList, client, server_url)
|
46
|
+
self.ContainerCheckpoint = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerCheckpoint, client, server_url)
|
47
|
+
self.ContainerExec = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerExec, client, server_url)
|
48
|
+
self.ContainerExecGetOutput = modal.client.UnaryStreamWrapper(grpclib_stub.ContainerExecGetOutput, client, server_url)
|
49
|
+
self.ContainerExecPutInput = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerExecPutInput, client, server_url)
|
50
|
+
self.ContainerExecWait = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerExecWait, client, server_url)
|
51
|
+
self.ContainerFilesystemExec = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerFilesystemExec, client, server_url)
|
52
|
+
self.ContainerFilesystemExecGetOutput = modal.client.UnaryStreamWrapper(grpclib_stub.ContainerFilesystemExecGetOutput, client, server_url)
|
53
|
+
self.ContainerHeartbeat = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerHeartbeat, client, server_url)
|
54
|
+
self.ContainerHello = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerHello, client, server_url)
|
55
|
+
self.ContainerLog = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerLog, client, server_url)
|
56
|
+
self.ContainerStop = modal.client.UnaryUnaryWrapper(grpclib_stub.ContainerStop, client, server_url)
|
57
|
+
self.DictClear = modal.client.UnaryUnaryWrapper(grpclib_stub.DictClear, client, server_url)
|
58
|
+
self.DictContains = modal.client.UnaryUnaryWrapper(grpclib_stub.DictContains, client, server_url)
|
59
|
+
self.DictContents = modal.client.UnaryStreamWrapper(grpclib_stub.DictContents, client, server_url)
|
60
|
+
self.DictDelete = modal.client.UnaryUnaryWrapper(grpclib_stub.DictDelete, client, server_url)
|
61
|
+
self.DictGet = modal.client.UnaryUnaryWrapper(grpclib_stub.DictGet, client, server_url)
|
62
|
+
self.DictGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.DictGetOrCreate, client, server_url)
|
63
|
+
self.DictHeartbeat = modal.client.UnaryUnaryWrapper(grpclib_stub.DictHeartbeat, client, server_url)
|
64
|
+
self.DictLen = modal.client.UnaryUnaryWrapper(grpclib_stub.DictLen, client, server_url)
|
65
|
+
self.DictList = modal.client.UnaryUnaryWrapper(grpclib_stub.DictList, client, server_url)
|
66
|
+
self.DictPop = modal.client.UnaryUnaryWrapper(grpclib_stub.DictPop, client, server_url)
|
67
|
+
self.DictUpdate = modal.client.UnaryUnaryWrapper(grpclib_stub.DictUpdate, client, server_url)
|
68
|
+
self.DomainCertificateVerify = modal.client.UnaryUnaryWrapper(grpclib_stub.DomainCertificateVerify, client, server_url)
|
69
|
+
self.DomainCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.DomainCreate, client, server_url)
|
70
|
+
self.DomainList = modal.client.UnaryUnaryWrapper(grpclib_stub.DomainList, client, server_url)
|
71
|
+
self.EnvironmentCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.EnvironmentCreate, client, server_url)
|
72
|
+
self.EnvironmentDelete = modal.client.UnaryUnaryWrapper(grpclib_stub.EnvironmentDelete, client, server_url)
|
73
|
+
self.EnvironmentGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.EnvironmentGetOrCreate, client, server_url)
|
74
|
+
self.EnvironmentList = modal.client.UnaryUnaryWrapper(grpclib_stub.EnvironmentList, client, server_url)
|
75
|
+
self.EnvironmentUpdate = modal.client.UnaryUnaryWrapper(grpclib_stub.EnvironmentUpdate, client, server_url)
|
76
|
+
self.FunctionAsyncInvoke = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionAsyncInvoke, client, server_url)
|
77
|
+
self.FunctionBindParams = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionBindParams, client, server_url)
|
78
|
+
self.FunctionCallCancel = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionCallCancel, client, server_url)
|
79
|
+
self.FunctionCallGetDataIn = modal.client.UnaryStreamWrapper(grpclib_stub.FunctionCallGetDataIn, client, server_url)
|
80
|
+
self.FunctionCallGetDataOut = modal.client.UnaryStreamWrapper(grpclib_stub.FunctionCallGetDataOut, client, server_url)
|
81
|
+
self.FunctionCallList = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionCallList, client, server_url)
|
82
|
+
self.FunctionCallPutDataOut = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionCallPutDataOut, client, server_url)
|
83
|
+
self.FunctionCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionCreate, client, server_url)
|
84
|
+
self.FunctionGet = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionGet, client, server_url)
|
85
|
+
self.FunctionGetCallGraph = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionGetCallGraph, client, server_url)
|
86
|
+
self.FunctionGetCurrentStats = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionGetCurrentStats, client, server_url)
|
87
|
+
self.FunctionGetDynamicConcurrency = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionGetDynamicConcurrency, client, server_url)
|
88
|
+
self.FunctionGetInputs = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionGetInputs, client, server_url)
|
89
|
+
self.FunctionGetOutputs = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionGetOutputs, client, server_url)
|
90
|
+
self.FunctionGetSerialized = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionGetSerialized, client, server_url)
|
91
|
+
self.FunctionMap = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionMap, client, server_url)
|
92
|
+
self.FunctionPrecreate = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionPrecreate, client, server_url)
|
93
|
+
self.FunctionPutInputs = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionPutInputs, client, server_url)
|
94
|
+
self.FunctionPutOutputs = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionPutOutputs, client, server_url)
|
95
|
+
self.FunctionRetryInputs = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionRetryInputs, client, server_url)
|
96
|
+
self.FunctionStartPtyShell = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionStartPtyShell, client, server_url)
|
97
|
+
self.FunctionUpdateSchedulingParams = modal.client.UnaryUnaryWrapper(grpclib_stub.FunctionUpdateSchedulingParams, client, server_url)
|
98
|
+
self.ImageFromId = modal.client.UnaryUnaryWrapper(grpclib_stub.ImageFromId, client, server_url)
|
99
|
+
self.ImageGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.ImageGetOrCreate, client, server_url)
|
100
|
+
self.ImageJoinStreaming = modal.client.UnaryStreamWrapper(grpclib_stub.ImageJoinStreaming, client, server_url)
|
101
|
+
self.MountGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.MountGetOrCreate, client, server_url)
|
102
|
+
self.MountPutFile = modal.client.UnaryUnaryWrapper(grpclib_stub.MountPutFile, client, server_url)
|
103
|
+
self.NotebookKernelPublishResults = modal.client.UnaryUnaryWrapper(grpclib_stub.NotebookKernelPublishResults, client, server_url)
|
104
|
+
self.ProxyAddIp = modal.client.UnaryUnaryWrapper(grpclib_stub.ProxyAddIp, client, server_url)
|
105
|
+
self.ProxyCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.ProxyCreate, client, server_url)
|
106
|
+
self.ProxyDelete = modal.client.UnaryUnaryWrapper(grpclib_stub.ProxyDelete, client, server_url)
|
107
|
+
self.ProxyGet = modal.client.UnaryUnaryWrapper(grpclib_stub.ProxyGet, client, server_url)
|
108
|
+
self.ProxyGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.ProxyGetOrCreate, client, server_url)
|
109
|
+
self.ProxyList = modal.client.UnaryUnaryWrapper(grpclib_stub.ProxyList, client, server_url)
|
110
|
+
self.ProxyRemoveIp = modal.client.UnaryUnaryWrapper(grpclib_stub.ProxyRemoveIp, client, server_url)
|
111
|
+
self.QueueClear = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueClear, client, server_url)
|
112
|
+
self.QueueDelete = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueDelete, client, server_url)
|
113
|
+
self.QueueGet = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueGet, client, server_url)
|
114
|
+
self.QueueGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueGetOrCreate, client, server_url)
|
115
|
+
self.QueueHeartbeat = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueHeartbeat, client, server_url)
|
116
|
+
self.QueueLen = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueLen, client, server_url)
|
117
|
+
self.QueueList = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueList, client, server_url)
|
118
|
+
self.QueueNextItems = modal.client.UnaryUnaryWrapper(grpclib_stub.QueueNextItems, client, server_url)
|
119
|
+
self.QueuePut = modal.client.UnaryUnaryWrapper(grpclib_stub.QueuePut, client, server_url)
|
120
|
+
self.SandboxCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxCreate, client, server_url)
|
121
|
+
self.SandboxGetLogs = modal.client.UnaryStreamWrapper(grpclib_stub.SandboxGetLogs, client, server_url)
|
122
|
+
self.SandboxGetResourceUsage = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxGetResourceUsage, client, server_url)
|
123
|
+
self.SandboxGetTaskId = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxGetTaskId, client, server_url)
|
124
|
+
self.SandboxGetTunnels = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxGetTunnels, client, server_url)
|
125
|
+
self.SandboxList = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxList, client, server_url)
|
126
|
+
self.SandboxRestore = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxRestore, client, server_url)
|
127
|
+
self.SandboxSnapshot = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxSnapshot, client, server_url)
|
128
|
+
self.SandboxSnapshotFs = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxSnapshotFs, client, server_url)
|
129
|
+
self.SandboxSnapshotGet = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxSnapshotGet, client, server_url)
|
130
|
+
self.SandboxSnapshotWait = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxSnapshotWait, client, server_url)
|
131
|
+
self.SandboxStdinWrite = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxStdinWrite, client, server_url)
|
132
|
+
self.SandboxTagsSet = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxTagsSet, client, server_url)
|
133
|
+
self.SandboxTerminate = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxTerminate, client, server_url)
|
134
|
+
self.SandboxWait = modal.client.UnaryUnaryWrapper(grpclib_stub.SandboxWait, client, server_url)
|
135
|
+
self.SecretDelete = modal.client.UnaryUnaryWrapper(grpclib_stub.SecretDelete, client, server_url)
|
136
|
+
self.SecretGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.SecretGetOrCreate, client, server_url)
|
137
|
+
self.SecretList = modal.client.UnaryUnaryWrapper(grpclib_stub.SecretList, client, server_url)
|
138
|
+
self.SharedVolumeDelete = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumeDelete, client, server_url)
|
139
|
+
self.SharedVolumeGetFile = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumeGetFile, client, server_url)
|
140
|
+
self.SharedVolumeGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumeGetOrCreate, client, server_url)
|
141
|
+
self.SharedVolumeHeartbeat = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumeHeartbeat, client, server_url)
|
142
|
+
self.SharedVolumeList = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumeList, client, server_url)
|
143
|
+
self.SharedVolumeListFiles = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumeListFiles, client, server_url)
|
144
|
+
self.SharedVolumeListFilesStream = modal.client.UnaryStreamWrapper(grpclib_stub.SharedVolumeListFilesStream, client, server_url)
|
145
|
+
self.SharedVolumePutFile = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumePutFile, client, server_url)
|
146
|
+
self.SharedVolumeRemoveFile = modal.client.UnaryUnaryWrapper(grpclib_stub.SharedVolumeRemoveFile, client, server_url)
|
147
|
+
self.TaskClusterHello = modal.client.UnaryUnaryWrapper(grpclib_stub.TaskClusterHello, client, server_url)
|
148
|
+
self.TaskCurrentInputs = modal.client.UnaryUnaryWrapper(grpclib_stub.TaskCurrentInputs, client, server_url)
|
149
|
+
self.TaskList = modal.client.UnaryUnaryWrapper(grpclib_stub.TaskList, client, server_url)
|
150
|
+
self.TaskResult = modal.client.UnaryUnaryWrapper(grpclib_stub.TaskResult, client, server_url)
|
151
|
+
self.TokenFlowCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.TokenFlowCreate, client, server_url)
|
152
|
+
self.TokenFlowWait = modal.client.UnaryUnaryWrapper(grpclib_stub.TokenFlowWait, client, server_url)
|
153
|
+
self.TunnelStart = modal.client.UnaryUnaryWrapper(grpclib_stub.TunnelStart, client, server_url)
|
154
|
+
self.TunnelStop = modal.client.UnaryUnaryWrapper(grpclib_stub.TunnelStop, client, server_url)
|
155
|
+
self.VolumeCommit = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeCommit, client, server_url)
|
156
|
+
self.VolumeCopyFiles = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeCopyFiles, client, server_url)
|
157
|
+
self.VolumeDelete = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeDelete, client, server_url)
|
158
|
+
self.VolumeGetFile = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeGetFile, client, server_url)
|
159
|
+
self.VolumeGetFile2 = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeGetFile2, client, server_url)
|
160
|
+
self.VolumeGetOrCreate = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeGetOrCreate, client, server_url)
|
161
|
+
self.VolumeHeartbeat = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeHeartbeat, client, server_url)
|
162
|
+
self.VolumeList = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeList, client, server_url)
|
163
|
+
self.VolumeListFiles = modal.client.UnaryStreamWrapper(grpclib_stub.VolumeListFiles, client, server_url)
|
164
|
+
self.VolumePutFiles = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumePutFiles, client, server_url)
|
165
|
+
self.VolumePutFiles2 = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumePutFiles2, client, server_url)
|
166
|
+
self.VolumeReload = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeReload, client, server_url)
|
167
|
+
self.VolumeRemoveFile = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeRemoveFile, client, server_url)
|
168
|
+
self.VolumeRename = modal.client.UnaryUnaryWrapper(grpclib_stub.VolumeRename, client, server_url)
|
169
|
+
self.WorkspaceNameLookup = modal.client.UnaryUnaryWrapper(grpclib_stub.WorkspaceNameLookup, client, server_url)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|