modal 1.0.5.dev11__tar.gz → 1.0.5.dev13__tar.gz
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-1.0.5.dev11 → modal-1.0.5.dev13}/PKG-INFO +1 -1
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_functions.py +21 -3
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/function_utils.py +8 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/grpc_utils.py +8 -3
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/client.pyi +2 -2
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/api.proto +5 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/api_pb2.py +586 -586
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/api_pb2.pyi +18 -4
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_version/__init__.py +1 -1
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/LICENSE +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/README.md +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/__main__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_clustered_functions.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_clustered_functions.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_container_entrypoint.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_ipython.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_location.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_object.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_output.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_partial_function.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_pty.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_resolver.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_resources.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/asgi.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/execution_context.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/telemetry.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_serialization.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_traceback.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_tunnel.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_tunnel.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_type_manager.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/app_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/async_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/blob_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/deprecation.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/docker_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/git_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/hash_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/http_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/logger.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/mount_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/name_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/package_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/shell_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_utils/time_utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_vendor/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_vendor/tblib.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/_watcher.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/app.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/app.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/call_graph.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/_download.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/_traceback.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/app.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/cluster.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/config.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/container.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/dict.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/entry_point.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/environment.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/import_refs.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/launch.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/network_file_system.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/profile.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/programs/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/programs/vscode.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/queues.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/run.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/secret.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/token.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/utils.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cli/volume.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/client.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cls.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/cls.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/config.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/container_process.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/container_process.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/dict.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/dict.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/environments.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/environments.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/exception.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/experimental/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/experimental/ipython.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/file_io.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/file_io.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/file_pattern_matcher.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/functions.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/functions.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/gpu.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/image.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/image.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/io_streams.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/io_streams.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/mount.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/mount.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/network_file_system.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/network_file_system.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/object.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/object.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/output.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/parallel_map.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/parallel_map.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/partial_function.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/partial_function.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/proxy.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/proxy.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/py.typed +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/queue.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/queue.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/requirements/2023.12.312.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/requirements/2023.12.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/requirements/2024.04.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/requirements/2024.10.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/requirements/PREVIEW.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/requirements/README.md +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/requirements/base-images.json +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/retries.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/runner.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/runner.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/running_app.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/sandbox.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/sandbox.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/schedule.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/scheduler_placement.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/secret.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/secret.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/serving.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/serving.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/snapshot.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/snapshot.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/stream_type.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/token_flow.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/token_flow.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/volume.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal/volume.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal.egg-info/requires.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal.egg-info/top_level.txt +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_docs/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/__init__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/api_grpc.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/modal_options_grpc.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/options.proto +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/options_grpc.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/options_pb2.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/options_pb2.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_proto/py.typed +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/modal_version/__main__.py +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/pyproject.toml +0 -0
- {modal-1.0.5.dev11 → modal-1.0.5.dev13}/setup.cfg +0 -0
@@ -356,12 +356,14 @@ class _InputPlaneInvocation:
|
|
356
356
|
client: _Client,
|
357
357
|
input_item: api_pb2.FunctionPutInputsItem,
|
358
358
|
function_id: str,
|
359
|
+
input_plane_region: str,
|
359
360
|
):
|
360
361
|
self.stub = stub
|
361
362
|
self.client = client # Used by the deserializer.
|
362
363
|
self.attempt_token = attempt_token
|
363
364
|
self.input_item = input_item
|
364
365
|
self.function_id = function_id
|
366
|
+
self.input_plane_region = input_plane_region
|
365
367
|
|
366
368
|
@staticmethod
|
367
369
|
async def create(
|
@@ -371,6 +373,7 @@ class _InputPlaneInvocation:
|
|
371
373
|
*,
|
372
374
|
client: _Client,
|
373
375
|
input_plane_url: str,
|
376
|
+
input_plane_region: str,
|
374
377
|
) -> "_InputPlaneInvocation":
|
375
378
|
stub = await client.get_stub(input_plane_url)
|
376
379
|
|
@@ -384,10 +387,13 @@ class _InputPlaneInvocation:
|
|
384
387
|
parent_input_id=current_input_id() or "",
|
385
388
|
input=input_item,
|
386
389
|
)
|
387
|
-
|
390
|
+
metadata: list[tuple[str, str]] = []
|
391
|
+
if input_plane_region and input_plane_region != "":
|
392
|
+
metadata.append(("x-modal-input-plane-region", input_plane_region))
|
393
|
+
response = await retry_transient_errors(stub.AttemptStart, request, metadata=metadata)
|
388
394
|
attempt_token = response.attempt_token
|
389
395
|
|
390
|
-
return _InputPlaneInvocation(stub, attempt_token, client, input_item, function_id)
|
396
|
+
return _InputPlaneInvocation(stub, attempt_token, client, input_item, function_id, input_plane_region)
|
391
397
|
|
392
398
|
async def run_function(self) -> Any:
|
393
399
|
# This will retry when the server returns GENERIC_STATUS_INTERNAL_FAILURE, i.e. lost inputs or worker preemption
|
@@ -399,10 +405,14 @@ class _InputPlaneInvocation:
|
|
399
405
|
timeout_secs=OUTPUTS_TIMEOUT,
|
400
406
|
requested_at=time.time(),
|
401
407
|
)
|
408
|
+
metadata: list[tuple[str, str]] = []
|
409
|
+
if self.input_plane_region and self.input_plane_region != "":
|
410
|
+
metadata.append(("x-modal-input-plane-region", self.input_plane_region))
|
402
411
|
await_response: api_pb2.AttemptAwaitResponse = await retry_transient_errors(
|
403
412
|
self.stub.AttemptAwait,
|
404
413
|
await_request,
|
405
414
|
attempt_timeout=OUTPUTS_TIMEOUT + ATTEMPT_TIMEOUT_GRACE_PERIOD,
|
415
|
+
metadata=metadata,
|
406
416
|
)
|
407
417
|
|
408
418
|
if await_response.HasField("output"):
|
@@ -419,7 +429,11 @@ class _InputPlaneInvocation:
|
|
419
429
|
attempt_token=self.attempt_token,
|
420
430
|
)
|
421
431
|
# TODO(ryan): Add exponential backoff?
|
422
|
-
retry_response = await retry_transient_errors(
|
432
|
+
retry_response = await retry_transient_errors(
|
433
|
+
self.stub.AttemptRetry,
|
434
|
+
retry_request,
|
435
|
+
metadata=metadata,
|
436
|
+
)
|
423
437
|
self.attempt_token = retry_response.attempt_token
|
424
438
|
continue
|
425
439
|
|
@@ -779,6 +793,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
779
793
|
req.method_definitions[method_name].CopyFrom(method_definition)
|
780
794
|
elif webhook_config:
|
781
795
|
req.webhook_config.CopyFrom(webhook_config)
|
796
|
+
|
782
797
|
response = await retry_transient_errors(resolver.client.stub.FunctionPrecreate, req)
|
783
798
|
self._hydrate(response.function_id, resolver.client, response.handle_metadata)
|
784
799
|
|
@@ -1383,6 +1398,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
1383
1398
|
self._method_handle_metadata = dict(metadata.method_handle_metadata)
|
1384
1399
|
self._definition_id = metadata.definition_id
|
1385
1400
|
self._input_plane_url = metadata.input_plane_url
|
1401
|
+
self._input_plane_region = metadata.input_plane_region
|
1386
1402
|
|
1387
1403
|
def _get_metadata(self):
|
1388
1404
|
# Overridden concrete implementation of base class method
|
@@ -1398,6 +1414,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
1398
1414
|
method_handle_metadata=self._method_handle_metadata,
|
1399
1415
|
function_schema=self._metadata.function_schema if self._metadata else None,
|
1400
1416
|
input_plane_url=self._input_plane_url,
|
1417
|
+
input_plane_region=self._input_plane_region,
|
1401
1418
|
)
|
1402
1419
|
|
1403
1420
|
def _check_no_web_url(self, fn_name: str):
|
@@ -1493,6 +1510,7 @@ Use the `Function.get_web_url()` method instead.
|
|
1493
1510
|
kwargs,
|
1494
1511
|
client=self.client,
|
1495
1512
|
input_plane_url=self._input_plane_url,
|
1513
|
+
input_plane_region=self._input_plane_region,
|
1496
1514
|
)
|
1497
1515
|
else:
|
1498
1516
|
invocation = await _Invocation.create(
|
@@ -603,6 +603,14 @@ class FunctionCreationStatus:
|
|
603
603
|
f"Custom domain for {self.tag} => [magenta underline]{custom_domain.url}[/magenta underline]"
|
604
604
|
)
|
605
605
|
|
606
|
+
elif self.response.function.flash_service_urls:
|
607
|
+
for flash_service_url in self.response.function.flash_service_urls:
|
608
|
+
flash_service_url_status_row = self.resolver.add_status_row()
|
609
|
+
flash_service_url_status_row.finish(
|
610
|
+
f"Created flash service endpoint for {self.tag} => "
|
611
|
+
f"[magenta underline]{flash_service_url}[/magenta underline]"
|
612
|
+
)
|
613
|
+
|
606
614
|
else:
|
607
615
|
for warning in self.response.server_warnings:
|
608
616
|
self.status_row.warning(warning)
|
@@ -198,6 +198,7 @@ async def retry_transient_errors(
|
|
198
198
|
total_timeout: Optional[float] = None, # timeout for the entire function call
|
199
199
|
attempt_timeout_floor=2.0, # always have at least this much timeout (only for total_timeout)
|
200
200
|
retry_warning_message: Optional[RetryWarningMessage] = None,
|
201
|
+
metadata: list[tuple[str, str]] = [],
|
201
202
|
) -> ResponseType:
|
202
203
|
"""Retry on transient gRPC failures with back-off until max_retries is reached.
|
203
204
|
If max_retries is None, retry forever."""
|
@@ -216,9 +217,13 @@ async def retry_transient_errors(
|
|
216
217
|
total_deadline = None
|
217
218
|
|
218
219
|
while True:
|
219
|
-
|
220
|
+
attempt_metadata = [
|
221
|
+
("x-idempotency-key", idempotency_key),
|
222
|
+
("x-retry-attempt", str(n_retries)),
|
223
|
+
*metadata,
|
224
|
+
]
|
220
225
|
if n_retries > 0:
|
221
|
-
|
226
|
+
attempt_metadata.append(("x-retry-delay", str(time.time() - t0)))
|
222
227
|
timeouts = []
|
223
228
|
if attempt_timeout is not None:
|
224
229
|
timeouts.append(attempt_timeout)
|
@@ -229,7 +234,7 @@ async def retry_transient_errors(
|
|
229
234
|
else:
|
230
235
|
timeout = None
|
231
236
|
try:
|
232
|
-
return await fn(*args, metadata=
|
237
|
+
return await fn(*args, metadata=attempt_metadata, timeout=timeout)
|
233
238
|
except (StreamTerminatedError, GRPCError, OSError, asyncio.TimeoutError, AttributeError) as exc:
|
234
239
|
if isinstance(exc, GRPCError) and exc.status not in status_codes:
|
235
240
|
if exc.status == Status.UNAUTHENTICATED:
|
@@ -31,7 +31,7 @@ class _Client:
|
|
31
31
|
server_url: str,
|
32
32
|
client_type: int,
|
33
33
|
credentials: typing.Optional[tuple[str, str]],
|
34
|
-
version: str = "1.0.5.
|
34
|
+
version: str = "1.0.5.dev13",
|
35
35
|
):
|
36
36
|
"""mdmd:hidden
|
37
37
|
The Modal client object is not intended to be instantiated directly by users.
|
@@ -160,7 +160,7 @@ class Client:
|
|
160
160
|
server_url: str,
|
161
161
|
client_type: int,
|
162
162
|
credentials: typing.Optional[tuple[str, str]],
|
163
|
-
version: str = "1.0.5.
|
163
|
+
version: str = "1.0.5.dev13",
|
164
164
|
):
|
165
165
|
"""mdmd:hidden
|
166
166
|
The Modal client object is not intended to be instantiated directly by users.
|
@@ -1412,6 +1412,8 @@ message Function {
|
|
1412
1412
|
// If set, client deps will be mounted into the container, and are
|
1413
1413
|
// no longer expected to exist in the image itself.
|
1414
1414
|
bool mount_client_dependencies = 82;
|
1415
|
+
|
1416
|
+
repeated string flash_service_urls = 83;
|
1415
1417
|
}
|
1416
1418
|
|
1417
1419
|
message FunctionAsyncInvokeRequest {
|
@@ -1564,6 +1566,8 @@ message FunctionData {
|
|
1564
1566
|
FunctionSchema function_schema = 32;
|
1565
1567
|
|
1566
1568
|
map<string, string> experimental_options = 33;
|
1569
|
+
|
1570
|
+
repeated string flash_service_urls = 34;
|
1567
1571
|
}
|
1568
1572
|
|
1569
1573
|
message FunctionExtended {
|
@@ -1699,6 +1703,7 @@ message FunctionHandleMetadata {
|
|
1699
1703
|
map<string, FunctionHandleMetadata> method_handle_metadata = 44;
|
1700
1704
|
FunctionSchema function_schema = 45;
|
1701
1705
|
optional string input_plane_url = 46;
|
1706
|
+
optional string input_plane_region = 47;
|
1702
1707
|
}
|
1703
1708
|
|
1704
1709
|
message FunctionInput {
|