zenml-nightly 0.70.0.dev20241125__py3-none-any.whl → 0.71.0.dev20241220__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.
- README.md +4 -4
- RELEASE_NOTES.md +112 -0
- zenml/VERSION +1 -1
- zenml/artifact_stores/base_artifact_store.py +2 -2
- zenml/artifacts/artifact_config.py +15 -6
- zenml/artifacts/utils.py +59 -32
- zenml/cli/__init__.py +22 -4
- zenml/cli/base.py +5 -5
- zenml/cli/login.py +26 -0
- zenml/cli/pipeline.py +111 -62
- zenml/cli/server.py +20 -20
- zenml/cli/service_connectors.py +3 -3
- zenml/cli/stack.py +0 -3
- zenml/cli/stack_components.py +0 -1
- zenml/cli/utils.py +0 -5
- zenml/client.py +62 -20
- zenml/config/compiler.py +12 -3
- zenml/config/pipeline_configurations.py +20 -0
- zenml/config/pipeline_run_configuration.py +1 -0
- zenml/config/secret_reference_mixin.py +1 -1
- zenml/config/server_config.py +4 -0
- zenml/config/step_configurations.py +21 -0
- zenml/constants.py +10 -0
- zenml/enums.py +1 -0
- zenml/image_builders/base_image_builder.py +5 -2
- zenml/image_builders/build_context.py +7 -16
- zenml/image_builders/local_image_builder.py +13 -3
- zenml/integrations/__init__.py +1 -0
- zenml/integrations/aws/__init__.py +3 -0
- zenml/integrations/aws/flavors/__init__.py +6 -0
- zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
- zenml/integrations/aws/image_builders/__init__.py +20 -0
- zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +14 -6
- zenml/integrations/constants.py +1 -0
- zenml/integrations/feast/__init__.py +1 -1
- zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -9
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +46 -2
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +13 -2
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +3 -1
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +3 -2
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +3 -2
- zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
- zenml/integrations/modal/__init__.py +46 -0
- zenml/integrations/modal/flavors/__init__.py +26 -0
- zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
- zenml/integrations/modal/step_operators/__init__.py +22 -0
- zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
- zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
- zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
- zenml/integrations/registry.py +2 -2
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
- zenml/io/filesystem.py +2 -2
- zenml/io/local_filesystem.py +3 -3
- zenml/materializers/built_in_materializer.py +18 -1
- zenml/materializers/structured_string_materializer.py +8 -3
- zenml/model/model.py +23 -101
- zenml/model/utils.py +21 -17
- zenml/models/__init__.py +6 -0
- zenml/models/v2/base/filter.py +26 -30
- zenml/models/v2/base/scoped.py +258 -5
- zenml/models/v2/core/artifact_version.py +21 -29
- zenml/models/v2/core/code_repository.py +1 -12
- zenml/models/v2/core/component.py +5 -68
- zenml/models/v2/core/flavor.py +1 -11
- zenml/models/v2/core/model.py +1 -57
- zenml/models/v2/core/model_version.py +11 -36
- zenml/models/v2/core/model_version_artifact.py +11 -3
- zenml/models/v2/core/model_version_pipeline_run.py +14 -3
- zenml/models/v2/core/pipeline.py +47 -55
- zenml/models/v2/core/pipeline_build.py +67 -12
- zenml/models/v2/core/pipeline_deployment.py +0 -10
- zenml/models/v2/core/pipeline_run.py +110 -32
- zenml/models/v2/core/run_metadata.py +30 -9
- zenml/models/v2/core/run_template.py +21 -29
- zenml/models/v2/core/schedule.py +0 -10
- zenml/models/v2/core/secret.py +0 -14
- zenml/models/v2/core/service.py +9 -16
- zenml/models/v2/core/service_connector.py +0 -11
- zenml/models/v2/core/stack.py +21 -30
- zenml/models/v2/core/step_run.py +24 -18
- zenml/models/v2/core/trigger.py +19 -3
- zenml/models/v2/misc/run_metadata.py +38 -0
- zenml/orchestrators/base_orchestrator.py +13 -1
- zenml/orchestrators/input_utils.py +19 -6
- zenml/orchestrators/output_utils.py +5 -1
- zenml/orchestrators/publish_utils.py +12 -5
- zenml/orchestrators/step_launcher.py +16 -16
- zenml/orchestrators/step_run_utils.py +18 -197
- zenml/orchestrators/step_runner.py +40 -3
- zenml/orchestrators/utils.py +79 -50
- zenml/pipelines/build_utils.py +12 -0
- zenml/pipelines/pipeline_decorator.py +4 -0
- zenml/pipelines/pipeline_definition.py +26 -8
- zenml/pipelines/run_utils.py +9 -5
- zenml/service_connectors/service_connector_utils.py +3 -9
- zenml/stack/stack_component.py +1 -1
- zenml/stack_deployments/aws_stack_deployment.py +22 -0
- zenml/steps/base_step.py +11 -1
- zenml/steps/entrypoint_function_utils.py +7 -3
- zenml/steps/step_decorator.py +4 -0
- zenml/steps/utils.py +23 -7
- zenml/types.py +4 -0
- zenml/utils/archivable.py +65 -36
- zenml/utils/code_utils.py +8 -4
- zenml/utils/docker_utils.py +9 -0
- zenml/utils/metadata_utils.py +186 -153
- zenml/utils/string_utils.py +41 -16
- zenml/utils/visualization_utils.py +4 -1
- zenml/zen_server/auth.py +9 -10
- zenml/zen_server/cloud_utils.py +3 -1
- zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
- zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
- zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
- zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
- zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
- zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
- zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
- zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
- zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
- zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
- zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
- zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
- zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
- zenml/zen_server/dashboard/index.html +4 -4
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +2 -2
- zenml/zen_server/rbac/endpoint_utils.py +6 -4
- zenml/zen_server/rbac/models.py +3 -2
- zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
- zenml/zen_server/rbac/utils.py +4 -7
- zenml/zen_server/routers/auth_endpoints.py +22 -11
- zenml/zen_server/routers/steps_endpoints.py +7 -1
- zenml/zen_server/routers/users_endpoints.py +35 -37
- zenml/zen_server/routers/workspaces_endpoints.py +44 -55
- zenml/zen_server/template_execution/utils.py +4 -1
- zenml/zen_server/utils.py +4 -3
- zenml/zen_stores/base_zen_store.py +10 -2
- zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
- zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
- zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
- zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
- zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +7 -6
- zenml/zen_stores/rest_zen_store.py +76 -43
- zenml/zen_stores/schemas/__init__.py +5 -1
- zenml/zen_stores/schemas/artifact_schemas.py +12 -11
- zenml/zen_stores/schemas/component_schemas.py +0 -3
- zenml/zen_stores/schemas/model_schemas.py +55 -17
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_run_schemas.py +52 -18
- zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
- zenml/zen_stores/schemas/run_metadata_schemas.py +66 -31
- zenml/zen_stores/schemas/step_run_schemas.py +40 -13
- zenml/zen_stores/schemas/utils.py +47 -3
- zenml/zen_stores/sql_zen_store.py +462 -134
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +239 -217
- zenml/utils/cloud_utils.py +0 -40
- zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
- zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
- zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
- zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
- zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
- zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
- zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
- zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
- zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
- zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
zenml/utils/metadata_utils.py
CHANGED
@@ -13,28 +13,30 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Utility functions to handle metadata for ZenML entities."""
|
15
15
|
|
16
|
-
import
|
17
|
-
from typing import Dict, Optional, Union, overload
|
16
|
+
from typing import Dict, List, Optional, Union, overload
|
18
17
|
from uuid import UUID
|
19
18
|
|
20
19
|
from zenml.client import Client
|
21
|
-
from zenml.enums import MetadataResourceTypes
|
20
|
+
from zenml.enums import MetadataResourceTypes, ModelStages
|
22
21
|
from zenml.logger import get_logger
|
23
22
|
from zenml.metadata.metadata_types import MetadataType
|
23
|
+
from zenml.models import RunMetadataResource
|
24
24
|
from zenml.steps.step_context import get_step_context
|
25
25
|
|
26
26
|
logger = get_logger(__name__)
|
27
27
|
|
28
28
|
|
29
29
|
@overload
|
30
|
-
def log_metadata(
|
30
|
+
def log_metadata(
|
31
|
+
metadata: Dict[str, MetadataType],
|
32
|
+
) -> None: ...
|
31
33
|
|
32
34
|
|
33
35
|
@overload
|
34
36
|
def log_metadata(
|
35
37
|
*,
|
36
38
|
metadata: Dict[str, MetadataType],
|
37
|
-
|
39
|
+
step_id: UUID,
|
38
40
|
) -> None: ...
|
39
41
|
|
40
42
|
|
@@ -42,8 +44,8 @@ def log_metadata(
|
|
42
44
|
def log_metadata(
|
43
45
|
*,
|
44
46
|
metadata: Dict[str, MetadataType],
|
45
|
-
|
46
|
-
|
47
|
+
step_name: str,
|
48
|
+
run_id_name_or_prefix: Union[UUID, str],
|
47
49
|
) -> None: ...
|
48
50
|
|
49
51
|
|
@@ -51,7 +53,7 @@ def log_metadata(
|
|
51
53
|
def log_metadata(
|
52
54
|
*,
|
53
55
|
metadata: Dict[str, MetadataType],
|
54
|
-
|
56
|
+
run_id_name_or_prefix: Union[UUID, str],
|
55
57
|
) -> None: ...
|
56
58
|
|
57
59
|
|
@@ -59,8 +61,7 @@ def log_metadata(
|
|
59
61
|
def log_metadata(
|
60
62
|
*,
|
61
63
|
metadata: Dict[str, MetadataType],
|
62
|
-
|
63
|
-
model_version: str,
|
64
|
+
artifact_version_id: UUID,
|
64
65
|
) -> None: ...
|
65
66
|
|
66
67
|
|
@@ -68,7 +69,8 @@ def log_metadata(
|
|
68
69
|
def log_metadata(
|
69
70
|
*,
|
70
71
|
metadata: Dict[str, MetadataType],
|
71
|
-
|
72
|
+
artifact_name: str,
|
73
|
+
artifact_version: Optional[str] = None,
|
72
74
|
) -> None: ...
|
73
75
|
|
74
76
|
|
@@ -76,33 +78,53 @@ def log_metadata(
|
|
76
78
|
def log_metadata(
|
77
79
|
*,
|
78
80
|
metadata: Dict[str, MetadataType],
|
79
|
-
|
81
|
+
infer_artifact: bool = False,
|
82
|
+
artifact_name: Optional[str] = None,
|
80
83
|
) -> None: ...
|
81
84
|
|
82
85
|
|
86
|
+
# Model Metadata
|
83
87
|
@overload
|
84
88
|
def log_metadata(
|
85
89
|
*,
|
86
90
|
metadata: Dict[str, MetadataType],
|
87
|
-
|
88
|
-
run_id_name_or_prefix: Union[UUID, str],
|
91
|
+
model_version_id: UUID,
|
89
92
|
) -> None: ...
|
90
93
|
|
91
94
|
|
95
|
+
@overload
|
92
96
|
def log_metadata(
|
97
|
+
*,
|
93
98
|
metadata: Dict[str, MetadataType],
|
94
|
-
|
99
|
+
model_name: str,
|
100
|
+
model_version: Union[ModelStages, int, str],
|
101
|
+
) -> None: ...
|
102
|
+
|
103
|
+
|
104
|
+
@overload
|
105
|
+
def log_metadata(
|
106
|
+
*,
|
107
|
+
metadata: Dict[str, MetadataType],
|
108
|
+
infer_model: bool = False,
|
109
|
+
) -> None: ...
|
110
|
+
|
111
|
+
|
112
|
+
def log_metadata(
|
113
|
+
metadata: Dict[str, MetadataType],
|
114
|
+
# Steps and runs
|
95
115
|
step_id: Optional[UUID] = None,
|
96
116
|
step_name: Optional[str] = None,
|
97
117
|
run_id_name_or_prefix: Optional[Union[UUID, str]] = None,
|
98
|
-
#
|
118
|
+
# Artifacts
|
99
119
|
artifact_version_id: Optional[UUID] = None,
|
100
120
|
artifact_name: Optional[str] = None,
|
101
121
|
artifact_version: Optional[str] = None,
|
102
|
-
|
122
|
+
infer_artifact: bool = False,
|
123
|
+
# Models
|
103
124
|
model_version_id: Optional[UUID] = None,
|
104
125
|
model_name: Optional[str] = None,
|
105
|
-
model_version: Optional[str] = None,
|
126
|
+
model_version: Optional[Union[ModelStages, int, str]] = None,
|
127
|
+
infer_model: bool = False,
|
106
128
|
) -> None:
|
107
129
|
"""Logs metadata for various resource types in a generalized way.
|
108
130
|
|
@@ -114,9 +136,13 @@ def log_metadata(
|
|
114
136
|
artifact_version_id: The ID of the artifact version
|
115
137
|
artifact_name: The name of the artifact.
|
116
138
|
artifact_version: The version of the artifact.
|
139
|
+
infer_artifact: Flag deciding whether the artifact version should be
|
140
|
+
inferred from the step context.
|
117
141
|
model_version_id: The ID of the model version.
|
118
142
|
model_name: The name of the model.
|
119
|
-
model_version: The version of the model
|
143
|
+
model_version: The version of the model.
|
144
|
+
infer_model: Flag deciding whether the model version should be
|
145
|
+
inferred from the step context.
|
120
146
|
|
121
147
|
Raises:
|
122
148
|
ValueError: If no identifiers are provided and the function is not
|
@@ -124,141 +150,147 @@ def log_metadata(
|
|
124
150
|
"""
|
125
151
|
client = Client()
|
126
152
|
|
127
|
-
|
128
|
-
|
129
|
-
if step_name is not None and run_id_name_or_prefix is not None:
|
130
|
-
run_model = client.get_pipeline_run(
|
131
|
-
name_id_or_prefix=run_id_name_or_prefix
|
132
|
-
)
|
133
|
-
step_model = run_model.steps[step_name]
|
153
|
+
resources: List[RunMetadataResource] = []
|
154
|
+
publisher_step_id = None
|
134
155
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
client.create_run_metadata(
|
141
|
-
metadata=metadata,
|
142
|
-
resource_id=step_model.id,
|
143
|
-
resource_type=MetadataResourceTypes.STEP_RUN,
|
144
|
-
)
|
145
|
-
if step_model.model_version:
|
146
|
-
client.create_run_metadata(
|
147
|
-
metadata=metadata,
|
148
|
-
resource_id=step_model.model_version.id,
|
149
|
-
resource_type=MetadataResourceTypes.MODEL_VERSION,
|
156
|
+
# Log metadata to a step by ID
|
157
|
+
if step_id is not None:
|
158
|
+
resources = [
|
159
|
+
RunMetadataResource(
|
160
|
+
id=step_id, type=MetadataResourceTypes.STEP_RUN
|
150
161
|
)
|
162
|
+
]
|
151
163
|
|
152
|
-
#
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
metadata=metadata,
|
159
|
-
resource_id=step_model.pipeline_run_id,
|
160
|
-
resource_type=MetadataResourceTypes.PIPELINE_RUN,
|
161
|
-
)
|
162
|
-
client.create_run_metadata(
|
163
|
-
metadata=metadata,
|
164
|
-
resource_id=step_model.id,
|
165
|
-
resource_type=MetadataResourceTypes.STEP_RUN,
|
164
|
+
# Log metadata to a step by name and run ID
|
165
|
+
elif step_name is not None and run_id_name_or_prefix is not None:
|
166
|
+
step_model_id = (
|
167
|
+
client.get_pipeline_run(name_id_or_prefix=run_id_name_or_prefix)
|
168
|
+
.steps[step_name]
|
169
|
+
.id
|
166
170
|
)
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
resource_id=step_model.model_version.id,
|
171
|
-
resource_type=MetadataResourceTypes.MODEL_VERSION,
|
171
|
+
resources = [
|
172
|
+
RunMetadataResource(
|
173
|
+
id=step_model_id, type=MetadataResourceTypes.STEP_RUN
|
172
174
|
)
|
175
|
+
]
|
173
176
|
|
174
|
-
#
|
175
|
-
# model as well.
|
177
|
+
# Log metadata to a run by ID
|
176
178
|
elif run_id_name_or_prefix is not None:
|
177
179
|
run_model = client.get_pipeline_run(
|
178
180
|
name_id_or_prefix=run_id_name_or_prefix
|
179
181
|
)
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
resource_type=MetadataResourceTypes.PIPELINE_RUN,
|
184
|
-
)
|
185
|
-
if run_model.model_version:
|
186
|
-
client.create_run_metadata(
|
187
|
-
metadata=metadata,
|
188
|
-
resource_id=run_model.model_version.id,
|
189
|
-
resource_type=MetadataResourceTypes.MODEL_VERSION,
|
182
|
+
resources = [
|
183
|
+
RunMetadataResource(
|
184
|
+
id=run_model.id, type=MetadataResourceTypes.PIPELINE_RUN
|
190
185
|
)
|
186
|
+
]
|
191
187
|
|
192
|
-
#
|
193
|
-
# to fetch the model version and attach the corresponding metadata to it.
|
188
|
+
# Log metadata to a model version by name and version
|
194
189
|
elif model_name is not None and model_version is not None:
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
client.create_run_metadata(
|
199
|
-
metadata=metadata,
|
200
|
-
resource_id=mv.id,
|
201
|
-
resource_type=MetadataResourceTypes.MODEL_VERSION,
|
190
|
+
model_version_model = client.get_model_version(
|
191
|
+
model_name_or_id=model_name,
|
192
|
+
model_version_name_or_number_or_id=model_version,
|
202
193
|
)
|
194
|
+
resources = [
|
195
|
+
RunMetadataResource(
|
196
|
+
id=model_version_model.id,
|
197
|
+
type=MetadataResourceTypes.MODEL_VERSION,
|
198
|
+
)
|
199
|
+
]
|
203
200
|
|
204
|
-
#
|
205
|
-
# attach the metadata to it.
|
201
|
+
# Log metadata to a model version by id
|
206
202
|
elif model_version_id is not None:
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
203
|
+
resources = [
|
204
|
+
RunMetadataResource(
|
205
|
+
id=model_version_id,
|
206
|
+
type=MetadataResourceTypes.MODEL_VERSION,
|
207
|
+
)
|
208
|
+
]
|
209
|
+
|
210
|
+
# Log metadata to a model through the step context
|
211
|
+
elif infer_model is True:
|
212
|
+
try:
|
213
|
+
step_context = get_step_context()
|
214
|
+
except RuntimeError:
|
215
|
+
raise ValueError(
|
216
|
+
"If you are using the `infer_model` option, the function must "
|
217
|
+
"be called inside a step with configured `model` in decorator."
|
218
|
+
"Otherwise, you can provide a `model_version_id` or a "
|
219
|
+
"combination of `model_name` and `model_version`."
|
220
|
+
)
|
221
|
+
|
222
|
+
if step_context.model_version is None:
|
223
|
+
raise ValueError(
|
224
|
+
"The step context does not feature any model versions."
|
225
|
+
)
|
226
|
+
|
227
|
+
resources = [
|
228
|
+
RunMetadataResource(
|
229
|
+
id=step_context.model_version.id,
|
230
|
+
type=MetadataResourceTypes.MODEL_VERSION,
|
231
|
+
)
|
232
|
+
]
|
233
|
+
|
234
|
+
# Log metadata to an artifact version by its name and version
|
235
|
+
elif artifact_name is not None and artifact_version is not None:
|
236
|
+
artifact_version_model = client.get_artifact_version(
|
237
|
+
name_id_or_prefix=artifact_name, version=artifact_version
|
214
238
|
)
|
239
|
+
resources = [
|
240
|
+
RunMetadataResource(
|
241
|
+
id=artifact_version_model.id,
|
242
|
+
type=MetadataResourceTypes.ARTIFACT_VERSION,
|
243
|
+
)
|
244
|
+
]
|
215
245
|
|
216
|
-
#
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
elif artifact_name is not None:
|
223
|
-
if artifact_version:
|
224
|
-
artifact_version_model = client.get_artifact_version(
|
225
|
-
name_id_or_prefix=artifact_name, version=artifact_version
|
246
|
+
# Log metadata to an artifact version by its ID
|
247
|
+
elif artifact_version_id is not None:
|
248
|
+
resources = [
|
249
|
+
RunMetadataResource(
|
250
|
+
id=artifact_version_id,
|
251
|
+
type=MetadataResourceTypes.ARTIFACT_VERSION,
|
226
252
|
)
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
253
|
+
]
|
254
|
+
|
255
|
+
# Log metadata to an artifact version through the step context
|
256
|
+
elif infer_artifact is True:
|
257
|
+
try:
|
258
|
+
step_context = get_step_context()
|
259
|
+
except RuntimeError:
|
260
|
+
raise ValueError(
|
261
|
+
"When you are using the `infer_artifact` option when you call "
|
262
|
+
"`log_metadata`, it must be called inside a step with outputs."
|
263
|
+
"Otherwise, you can provide a `artifact_version_id` or a "
|
264
|
+
"combination of `artifact_name` and `artifact_version`."
|
231
265
|
)
|
232
|
-
else:
|
233
|
-
step_context = None
|
234
|
-
with contextlib.suppress(RuntimeError):
|
235
|
-
step_context = get_step_context()
|
236
266
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
267
|
+
step_output_names = list(step_context._outputs.keys())
|
268
|
+
|
269
|
+
if artifact_name is not None:
|
270
|
+
# If a name provided, ensure it is in the outputs
|
271
|
+
if artifact_name not in step_output_names:
|
272
|
+
raise ValueError(
|
273
|
+
f"The provided artifact name`{artifact_name}` does not "
|
274
|
+
f"exist in the step outputs: {step_output_names}."
|
244
275
|
)
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
276
|
+
else:
|
277
|
+
# If no name provided, ensure there is only one output
|
278
|
+
if len(step_output_names) > 1:
|
279
|
+
raise ValueError(
|
280
|
+
"There is more than one output. If you would like to use "
|
281
|
+
"the `infer_artifact` option, you need to define an "
|
282
|
+
"`artifact_name`."
|
249
283
|
)
|
250
284
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
metadata=metadata,
|
259
|
-
resource_id=artifact_version_model.id,
|
260
|
-
resource_type=MetadataResourceTypes.ARTIFACT_VERSION,
|
285
|
+
if len(step_output_names) == 0:
|
286
|
+
raise ValueError("The step does not have any outputs.")
|
287
|
+
|
288
|
+
artifact_name = step_output_names[0]
|
289
|
+
|
290
|
+
step_context.add_output_metadata(
|
291
|
+
metadata=metadata, output_name=artifact_name
|
261
292
|
)
|
293
|
+
return
|
262
294
|
|
263
295
|
# If every additional value is None, that means we are calling it bare bones
|
264
296
|
# and this call needs to happen during a step execution. We will use the
|
@@ -287,22 +319,14 @@ def log_metadata(
|
|
287
319
|
"of the step execution, please provide the required "
|
288
320
|
"identifiers."
|
289
321
|
)
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
client.create_run_metadata(
|
296
|
-
metadata=metadata,
|
297
|
-
resource_id=step_context.step_run.id,
|
298
|
-
resource_type=MetadataResourceTypes.STEP_RUN,
|
299
|
-
)
|
300
|
-
if step_context.model_version:
|
301
|
-
client.create_run_metadata(
|
302
|
-
metadata=metadata,
|
303
|
-
resource_id=step_context.model_version.id,
|
304
|
-
resource_type=MetadataResourceTypes.MODEL_VERSION,
|
322
|
+
|
323
|
+
resources = [
|
324
|
+
RunMetadataResource(
|
325
|
+
id=step_context.step_run.id,
|
326
|
+
type=MetadataResourceTypes.STEP_RUN,
|
305
327
|
)
|
328
|
+
]
|
329
|
+
publisher_step_id = step_context.step_run.id
|
306
330
|
|
307
331
|
else:
|
308
332
|
raise ValueError(
|
@@ -310,26 +334,35 @@ def log_metadata(
|
|
310
334
|
Unsupported way to call the `log_metadata`. Possible combinations "
|
311
335
|
include:
|
312
336
|
|
313
|
-
#
|
314
|
-
# Logs the metadata to the step, its run and possibly its model
|
337
|
+
# Automatic logging to a step (within a step)
|
315
338
|
log_metadata(metadata={})
|
316
339
|
|
317
|
-
#
|
318
|
-
# Logs the metadata to the step, its run and possibly its model
|
340
|
+
# Manual logging to a step
|
319
341
|
log_metadata(metadata={}, step_name=..., run_id_name_or_prefix=...)
|
320
342
|
log_metadata(metadata={}, step_id=...)
|
321
343
|
|
322
|
-
#
|
323
|
-
# Logs the metadata to the run, possibly its model
|
344
|
+
# Manual logging to a run
|
324
345
|
log_metadata(metadata={}, run_id_name_or_prefix=...)
|
325
346
|
|
326
|
-
#
|
347
|
+
# Automatic logging to a model (within a step)
|
348
|
+
log_metadata(metadata={}, infer_model=True)
|
349
|
+
|
350
|
+
# Manual logging to a model
|
327
351
|
log_metadata(metadata={}, model_name=..., model_version=...)
|
328
352
|
log_metadata(metadata={}, model_version_id=...)
|
329
353
|
|
330
|
-
#
|
331
|
-
log_metadata(metadata={},
|
354
|
+
# Automatic logging to an artifact (within a step)
|
355
|
+
log_metadata(metadata={}, infer_artifact=True) # step with single output
|
356
|
+
log_metadata(metadata={}, artifact_name=..., infer_artifact=True) # specific output of a step
|
357
|
+
|
358
|
+
# Manual logging to an artifact
|
332
359
|
log_metadata(metadata={}, artifact_name=..., artifact_version=...)
|
333
360
|
log_metadata(metadata={}, artifact_version_id=...)
|
334
361
|
"""
|
335
362
|
)
|
363
|
+
|
364
|
+
client.create_run_metadata(
|
365
|
+
metadata=metadata,
|
366
|
+
resources=resources,
|
367
|
+
publisher_step_id=publisher_step_id,
|
368
|
+
)
|
zenml/utils/string_utils.py
CHANGED
@@ -14,11 +14,11 @@
|
|
14
14
|
"""Utils for strings."""
|
15
15
|
|
16
16
|
import base64
|
17
|
-
import datetime
|
18
17
|
import functools
|
19
18
|
import random
|
20
19
|
import string
|
21
|
-
from
|
20
|
+
from datetime import datetime
|
21
|
+
from typing import Any, Callable, Dict, Optional, TypeVar, cast
|
22
22
|
|
23
23
|
from pydantic import BaseModel
|
24
24
|
|
@@ -147,30 +147,55 @@ def validate_name(model: BaseModel) -> None:
|
|
147
147
|
|
148
148
|
def format_name_template(
|
149
149
|
name_template: str,
|
150
|
-
|
150
|
+
substitutions: Optional[Dict[str, str]] = None,
|
151
151
|
) -> str:
|
152
152
|
"""Formats a name template with the given arguments.
|
153
153
|
|
154
|
-
|
155
|
-
|
156
|
-
Extra placeholders need to be explicitly passed in as kwargs.
|
154
|
+
Default substitutions for `{date}` and `{time}` placeholders will be used if
|
155
|
+
not included in the provided substitutions.
|
157
156
|
|
158
157
|
Args:
|
159
158
|
name_template: The name template to format.
|
160
|
-
|
159
|
+
substitutions: Substitutions to use in the template.
|
161
160
|
|
162
161
|
Returns:
|
163
162
|
The formatted name template.
|
163
|
+
|
164
|
+
Raises:
|
165
|
+
KeyError: If a key in template is missing in the substitutions.
|
166
|
+
ValueError: If the formatted name is empty.
|
164
167
|
"""
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
168
|
+
substitutions = substitutions or {}
|
169
|
+
|
170
|
+
if ("date" not in substitutions and "{date}" in name_template) or (
|
171
|
+
"time" not in substitutions and "{time}" in name_template
|
172
|
+
):
|
173
|
+
from zenml import get_step_context
|
174
|
+
|
175
|
+
try:
|
176
|
+
pr = get_step_context().pipeline_run
|
177
|
+
start_time = pr.start_time
|
178
|
+
substitutions.update(pr.config.substitutions)
|
179
|
+
except RuntimeError:
|
180
|
+
start_time = None
|
181
|
+
|
182
|
+
if start_time is None:
|
183
|
+
start_time = datetime.utcnow()
|
184
|
+
substitutions.setdefault("date", start_time.strftime("%Y_%m_%d"))
|
185
|
+
substitutions.setdefault("time", start_time.strftime("%H_%M_%S_%f"))
|
186
|
+
|
187
|
+
try:
|
188
|
+
formatted_name = name_template.format(**substitutions)
|
189
|
+
except KeyError as e:
|
190
|
+
raise KeyError(
|
191
|
+
f"Could not format the name template `{name_template}`. "
|
192
|
+
f"Missing key: {e}"
|
193
|
+
)
|
194
|
+
|
195
|
+
if not formatted_name:
|
196
|
+
raise ValueError("Empty names are not allowed.")
|
197
|
+
|
198
|
+
return formatted_name
|
174
199
|
|
175
200
|
|
176
201
|
def substitute_string(value: V, substitution_func: Callable[[str], str]) -> V:
|
@@ -13,9 +13,10 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Utility functions for dashboard visualizations."""
|
15
15
|
|
16
|
+
import json
|
16
17
|
from typing import TYPE_CHECKING, Optional
|
17
18
|
|
18
|
-
from IPython.core.display import HTML, Image, Markdown, display
|
19
|
+
from IPython.core.display import HTML, JSON, Image, Markdown, display
|
19
20
|
|
20
21
|
from zenml.artifacts.utils import load_artifact_visualization
|
21
22
|
from zenml.enums import VisualizationType
|
@@ -63,6 +64,8 @@ def visualize_artifact(
|
|
63
64
|
assert isinstance(visualization.value, str)
|
64
65
|
table = format_csv_visualization_as_html(visualization.value)
|
65
66
|
display(HTML(table))
|
67
|
+
elif visualization.type == VisualizationType.JSON:
|
68
|
+
display(JSON(json.loads(visualization.value)))
|
66
69
|
else:
|
67
70
|
display(visualization.value)
|
68
71
|
|
zenml/zen_server/auth.py
CHANGED
@@ -413,10 +413,7 @@ def authenticate_credentials(
|
|
413
413
|
logger.error(error)
|
414
414
|
raise CredentialsNotValid(error)
|
415
415
|
|
416
|
-
if pipeline_run_status
|
417
|
-
ExecutionStatus.FAILED,
|
418
|
-
ExecutionStatus.COMPLETED,
|
419
|
-
]:
|
416
|
+
if pipeline_run_status.is_finished:
|
420
417
|
error = (
|
421
418
|
f"The execution of pipeline run "
|
422
419
|
f"{decoded_token.pipeline_run_id} has already concluded and "
|
@@ -461,10 +458,7 @@ def authenticate_credentials(
|
|
461
458
|
logger.error(error)
|
462
459
|
raise CredentialsNotValid(error)
|
463
460
|
|
464
|
-
if step_run_status
|
465
|
-
ExecutionStatus.FAILED,
|
466
|
-
ExecutionStatus.COMPLETED,
|
467
|
-
]:
|
461
|
+
if step_run_status.is_finished:
|
468
462
|
error = (
|
469
463
|
f"The execution of step run "
|
470
464
|
f"{decoded_token.step_run_id} has already concluded and "
|
@@ -821,7 +815,10 @@ def generate_access_token(
|
|
821
815
|
response: The FastAPI response object.
|
822
816
|
device: The device used for authentication.
|
823
817
|
api_key: The service account API key used for authentication.
|
824
|
-
expires_in: The number of seconds until the token expires.
|
818
|
+
expires_in: The number of seconds until the token expires. If not set,
|
819
|
+
the default value is determined automatically based on the server
|
820
|
+
configuration and type of token. If set to 0, the token will not
|
821
|
+
expire.
|
825
822
|
schedule_id: The ID of the schedule to scope the token to.
|
826
823
|
pipeline_run_id: The ID of the pipeline run to scope the token to.
|
827
824
|
step_run_id: The ID of the step run to scope the token to.
|
@@ -835,7 +832,9 @@ def generate_access_token(
|
|
835
832
|
# according to the values configured in the server config. Device tokens are
|
836
833
|
# handled separately from regular user tokens.
|
837
834
|
expires: Optional[datetime] = None
|
838
|
-
if expires_in:
|
835
|
+
if expires_in == 0:
|
836
|
+
expires_in = None
|
837
|
+
elif expires_in is not None:
|
839
838
|
expires = datetime.utcnow() + timedelta(seconds=expires_in)
|
840
839
|
elif device:
|
841
840
|
# If a device was used for authentication, the token will expire
|
zenml/zen_server/cloud_utils.py
CHANGED
@@ -170,7 +170,9 @@ class ZenMLCloudConnection:
|
|
170
170
|
token = self._fetch_auth_token()
|
171
171
|
self._session.headers.update({"Authorization": "Bearer " + token})
|
172
172
|
|
173
|
-
retries = Retry(
|
173
|
+
retries = Retry(
|
174
|
+
total=5, backoff_factor=0.1, status_forcelist=[502, 504]
|
175
|
+
)
|
174
176
|
self._session.mount(
|
175
177
|
"https://",
|
176
178
|
HTTPAdapter(
|
@@ -1 +1 @@
|
|
1
|
-
import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-
|
1
|
+
import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-FO-p0GU7.js";import{E as r}from"./EmptyState-BzdlCwp3.js";import{S as a}from"./help-Cc9bBIJH.js";import{L as o}from"./@react-router-B3Z5rLr2.js";import"./@tanstack-DT5WLu9C.js";import"./@reactflow-D2Y7BWwz.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
|