zenml-nightly 0.58.2.dev20240617__py3-none-any.whl → 0.58.2.dev20240619__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.
- zenml/VERSION +1 -1
- zenml/_hub/client.py +8 -5
- zenml/actions/base_action.py +8 -10
- zenml/artifact_stores/base_artifact_store.py +20 -15
- zenml/artifact_stores/local_artifact_store.py +3 -2
- zenml/artifacts/artifact_config.py +34 -19
- zenml/artifacts/external_artifact.py +18 -8
- zenml/artifacts/external_artifact_config.py +14 -6
- zenml/artifacts/unmaterialized_artifact.py +2 -11
- zenml/cli/__init__.py +6 -0
- zenml/cli/artifact.py +20 -2
- zenml/cli/served_model.py +0 -1
- zenml/cli/server.py +3 -3
- zenml/cli/utils.py +36 -40
- zenml/cli/web_login.py +2 -2
- zenml/client.py +198 -24
- zenml/client_lazy_loader.py +20 -14
- zenml/config/base_settings.py +5 -6
- zenml/config/build_configuration.py +1 -1
- zenml/config/compiler.py +3 -3
- zenml/config/docker_settings.py +27 -28
- zenml/config/global_config.py +33 -37
- zenml/config/pipeline_configurations.py +8 -11
- zenml/config/pipeline_run_configuration.py +6 -2
- zenml/config/pipeline_spec.py +3 -4
- zenml/config/resource_settings.py +8 -9
- zenml/config/schedule.py +16 -20
- zenml/config/secret_reference_mixin.py +6 -3
- zenml/config/secrets_store_config.py +16 -23
- zenml/config/server_config.py +50 -46
- zenml/config/settings_resolver.py +1 -1
- zenml/config/source.py +45 -35
- zenml/config/step_configurations.py +53 -31
- zenml/config/step_run_info.py +3 -0
- zenml/config/store_config.py +20 -19
- zenml/config/strict_base_model.py +2 -6
- zenml/constants.py +26 -2
- zenml/container_registries/base_container_registry.py +3 -2
- zenml/container_registries/default_container_registry.py +3 -3
- zenml/event_hub/base_event_hub.py +1 -1
- zenml/event_sources/base_event_source.py +11 -16
- zenml/exceptions.py +4 -0
- zenml/integrations/airflow/__init__.py +2 -6
- zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +6 -7
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +13 -249
- zenml/integrations/airflow/orchestrators/dag_generator.py +5 -3
- zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +5 -4
- zenml/integrations/aws/__init__.py +1 -1
- zenml/integrations/aws/flavors/aws_container_registry_flavor.py +3 -2
- zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +11 -5
- zenml/integrations/aws/flavors/sagemaker_step_operator_flavor.py +6 -2
- zenml/integrations/aws/service_connectors/aws_service_connector.py +5 -4
- zenml/integrations/aws/step_operators/sagemaker_step_operator.py +1 -1
- zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +4 -4
- zenml/integrations/azure/service_connectors/azure_service_connector.py +4 -3
- zenml/integrations/azure/step_operators/azureml_step_operator.py +2 -1
- zenml/integrations/bentoml/steps/bentoml_deployer.py +1 -1
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +8 -12
- zenml/integrations/comet/flavors/comet_experiment_tracker_flavor.py +1 -1
- zenml/integrations/constants.py +0 -1
- zenml/integrations/deepchecks/__init__.py +1 -0
- zenml/integrations/evidently/__init__.py +5 -3
- zenml/integrations/evidently/column_mapping.py +11 -3
- zenml/integrations/evidently/data_validators/evidently_data_validator.py +21 -3
- zenml/integrations/evidently/metrics.py +5 -6
- zenml/integrations/evidently/tests.py +5 -6
- zenml/integrations/facets/models.py +2 -6
- zenml/integrations/feast/__init__.py +3 -1
- zenml/integrations/feast/feature_stores/feast_feature_store.py +0 -23
- zenml/integrations/gcp/__init__.py +1 -1
- zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +1 -1
- zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +1 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +234 -103
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +57 -42
- zenml/integrations/gcp/step_operators/vertex_step_operator.py +1 -0
- zenml/integrations/github/code_repositories/github_code_repository.py +1 -1
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +9 -13
- zenml/integrations/great_expectations/__init__.py +1 -1
- zenml/integrations/great_expectations/data_validators/ge_data_validator.py +44 -44
- zenml/integrations/great_expectations/flavors/great_expectations_data_validator_flavor.py +35 -2
- zenml/integrations/great_expectations/ge_store_backend.py +24 -11
- zenml/integrations/great_expectations/materializers/ge_materializer.py +3 -3
- zenml/integrations/great_expectations/utils.py +5 -5
- zenml/integrations/huggingface/__init__.py +3 -0
- zenml/integrations/huggingface/flavors/huggingface_model_deployer_flavor.py +1 -1
- zenml/integrations/huggingface/steps/__init__.py +3 -0
- zenml/integrations/huggingface/steps/accelerate_runner.py +149 -0
- zenml/integrations/huggingface/steps/huggingface_deployer.py +2 -2
- zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +1 -1
- zenml/integrations/hyperai/service_connectors/hyperai_service_connector.py +4 -3
- zenml/integrations/kubeflow/__init__.py +1 -1
- zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +48 -81
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +295 -245
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +1 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +11 -2
- zenml/integrations/kubernetes/pod_settings.py +17 -31
- zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py +8 -7
- zenml/integrations/label_studio/__init__.py +1 -3
- zenml/integrations/label_studio/annotators/label_studio_annotator.py +3 -4
- zenml/integrations/label_studio/flavors/label_studio_annotator_flavor.py +2 -2
- zenml/integrations/langchain/__init__.py +5 -1
- zenml/integrations/langchain/materializers/document_materializer.py +44 -8
- zenml/integrations/mlflow/__init__.py +9 -3
- zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +1 -1
- zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +29 -37
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +4 -4
- zenml/integrations/mlflow/steps/mlflow_deployer.py +1 -1
- zenml/integrations/neptune/flavors/neptune_experiment_tracker_flavor.py +1 -1
- zenml/integrations/neural_prophet/__init__.py +5 -1
- zenml/integrations/pigeon/flavors/pigeon_annotator_flavor.py +1 -1
- zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +9 -8
- zenml/integrations/seldon/seldon_client.py +52 -67
- zenml/integrations/seldon/services/seldon_deployment.py +3 -3
- zenml/integrations/seldon/steps/seldon_deployer.py +4 -4
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +15 -5
- zenml/integrations/skypilot_aws/__init__.py +1 -1
- zenml/integrations/skypilot_aws/flavors/skypilot_orchestrator_aws_vm_flavor.py +1 -1
- zenml/integrations/skypilot_azure/__init__.py +1 -1
- zenml/integrations/skypilot_azure/flavors/skypilot_orchestrator_azure_vm_flavor.py +1 -1
- zenml/integrations/skypilot_gcp/__init__.py +2 -1
- zenml/integrations/skypilot_gcp/flavors/skypilot_orchestrator_gcp_vm_flavor.py +1 -1
- zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +2 -2
- zenml/integrations/spark/flavors/spark_step_operator_flavor.py +1 -1
- zenml/integrations/spark/step_operators/spark_step_operator.py +2 -0
- zenml/integrations/tekton/__init__.py +1 -1
- zenml/integrations/tekton/flavors/tekton_orchestrator_flavor.py +66 -23
- zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +547 -233
- zenml/integrations/tensorboard/__init__.py +1 -12
- zenml/integrations/tensorboard/services/tensorboard_service.py +3 -5
- zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +6 -6
- zenml/integrations/tensorflow/__init__.py +2 -10
- zenml/integrations/tensorflow/materializers/keras_materializer.py +17 -9
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +9 -14
- zenml/integrations/whylogs/flavors/whylogs_data_validator_flavor.py +1 -1
- zenml/lineage_graph/lineage_graph.py +1 -1
- zenml/logging/step_logging.py +15 -7
- zenml/materializers/built_in_materializer.py +3 -3
- zenml/materializers/pydantic_materializer.py +2 -2
- zenml/metadata/lazy_load.py +4 -4
- zenml/metadata/metadata_types.py +64 -4
- zenml/model/model.py +79 -54
- zenml/model_deployers/base_model_deployer.py +14 -12
- zenml/model_registries/base_model_registry.py +17 -15
- zenml/models/__init__.py +79 -206
- zenml/models/v2/base/base.py +54 -41
- zenml/models/v2/base/base_plugin_flavor.py +2 -6
- zenml/models/v2/base/filter.py +91 -76
- zenml/models/v2/base/page.py +2 -12
- zenml/models/v2/base/scoped.py +4 -7
- zenml/models/v2/core/api_key.py +22 -8
- zenml/models/v2/core/artifact.py +2 -2
- zenml/models/v2/core/artifact_version.py +74 -40
- zenml/models/v2/core/code_repository.py +37 -10
- zenml/models/v2/core/component.py +65 -16
- zenml/models/v2/core/device.py +14 -4
- zenml/models/v2/core/event_source.py +1 -2
- zenml/models/v2/core/flavor.py +74 -8
- zenml/models/v2/core/logs.py +68 -8
- zenml/models/v2/core/model.py +8 -4
- zenml/models/v2/core/model_version.py +25 -6
- zenml/models/v2/core/model_version_artifact.py +51 -21
- zenml/models/v2/core/model_version_pipeline_run.py +45 -13
- zenml/models/v2/core/pipeline.py +37 -72
- zenml/models/v2/core/pipeline_build.py +29 -17
- zenml/models/v2/core/pipeline_deployment.py +18 -6
- zenml/models/v2/core/pipeline_namespace.py +113 -0
- zenml/models/v2/core/pipeline_run.py +50 -22
- zenml/models/v2/core/run_metadata.py +59 -36
- zenml/models/v2/core/schedule.py +37 -24
- zenml/models/v2/core/secret.py +31 -12
- zenml/models/v2/core/service.py +64 -36
- zenml/models/v2/core/service_account.py +24 -11
- zenml/models/v2/core/service_connector.py +219 -44
- zenml/models/v2/core/stack.py +45 -17
- zenml/models/v2/core/step_run.py +28 -8
- zenml/models/v2/core/tag.py +8 -4
- zenml/models/v2/core/trigger.py +2 -2
- zenml/models/v2/core/trigger_execution.py +1 -0
- zenml/models/v2/core/user.py +18 -21
- zenml/models/v2/core/workspace.py +13 -3
- zenml/models/v2/misc/build_item.py +3 -3
- zenml/models/v2/misc/external_user.py +2 -6
- zenml/models/v2/misc/hub_plugin_models.py +9 -9
- zenml/models/v2/misc/loaded_visualization.py +2 -2
- zenml/models/v2/misc/service_connector_type.py +8 -17
- zenml/models/v2/misc/user_auth.py +7 -2
- zenml/new/pipelines/build_utils.py +3 -3
- zenml/new/pipelines/pipeline.py +17 -13
- zenml/new/pipelines/run_utils.py +103 -1
- zenml/orchestrators/base_orchestrator.py +10 -7
- zenml/orchestrators/local_docker/local_docker_orchestrator.py +1 -1
- zenml/orchestrators/step_launcher.py +28 -4
- zenml/orchestrators/step_runner.py +3 -6
- zenml/orchestrators/utils.py +1 -1
- zenml/plugins/base_plugin_flavor.py +6 -10
- zenml/plugins/plugin_flavor_registry.py +3 -7
- zenml/secret/base_secret.py +7 -8
- zenml/service_connectors/docker_service_connector.py +4 -3
- zenml/service_connectors/service_connector.py +5 -12
- zenml/service_connectors/service_connector_registry.py +2 -4
- zenml/services/container/container_service.py +1 -1
- zenml/services/container/container_service_endpoint.py +1 -1
- zenml/services/local/local_service.py +1 -1
- zenml/services/local/local_service_endpoint.py +1 -1
- zenml/services/service.py +16 -10
- zenml/services/service_type.py +4 -5
- zenml/services/terraform/terraform_service.py +1 -1
- zenml/stack/flavor.py +1 -5
- zenml/stack/flavor_registry.py +4 -4
- zenml/stack/stack.py +4 -1
- zenml/stack/stack_component.py +55 -31
- zenml/step_operators/step_operator_entrypoint_configuration.py +1 -0
- zenml/steps/base_step.py +34 -28
- zenml/steps/entrypoint_function_utils.py +3 -5
- zenml/steps/utils.py +12 -14
- zenml/utils/cuda_utils.py +50 -0
- zenml/utils/deprecation_utils.py +18 -20
- zenml/utils/dict_utils.py +1 -1
- zenml/utils/filesync_model.py +65 -28
- zenml/utils/function_utils.py +260 -0
- zenml/utils/json_utils.py +131 -0
- zenml/utils/mlstacks_utils.py +2 -2
- zenml/utils/pipeline_docker_image_builder.py +9 -0
- zenml/utils/pydantic_utils.py +270 -62
- zenml/utils/secret_utils.py +65 -12
- zenml/utils/source_utils.py +2 -2
- zenml/utils/typed_model.py +5 -3
- zenml/utils/typing_utils.py +243 -0
- zenml/utils/yaml_utils.py +1 -1
- zenml/zen_server/auth.py +2 -2
- zenml/zen_server/cloud_utils.py +6 -6
- zenml/zen_server/deploy/base_provider.py +1 -1
- zenml/zen_server/deploy/deployment.py +6 -8
- zenml/zen_server/deploy/docker/docker_zen_server.py +3 -4
- zenml/zen_server/deploy/local/local_provider.py +0 -1
- zenml/zen_server/deploy/local/local_zen_server.py +6 -6
- zenml/zen_server/deploy/terraform/terraform_zen_server.py +4 -6
- zenml/zen_server/exceptions.py +4 -1
- zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
- zenml/zen_server/pipeline_deployment/utils.py +48 -68
- zenml/zen_server/rbac/models.py +2 -5
- zenml/zen_server/rbac/utils.py +11 -14
- zenml/zen_server/routers/auth_endpoints.py +2 -2
- zenml/zen_server/routers/pipeline_builds_endpoints.py +1 -1
- zenml/zen_server/routers/runs_endpoints.py +1 -1
- zenml/zen_server/routers/secrets_endpoints.py +3 -2
- zenml/zen_server/routers/server_endpoints.py +1 -1
- zenml/zen_server/routers/steps_endpoints.py +1 -1
- zenml/zen_server/routers/workspaces_endpoints.py +1 -1
- zenml/zen_stores/base_zen_store.py +46 -9
- zenml/zen_stores/migrations/utils.py +42 -46
- zenml/zen_stores/migrations/versions/0701da9951a0_added_service_table.py +1 -1
- zenml/zen_stores/migrations/versions/1041bc644e0d_remove_secrets_manager.py +5 -3
- zenml/zen_stores/migrations/versions/10a907dad202_delete_mlmd_tables.py +1 -1
- zenml/zen_stores/migrations/versions/26b776ad583e_redesign_artifacts.py +8 -10
- zenml/zen_stores/migrations/versions/37835ce041d2_optimizing_database.py +3 -3
- zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py +10 -12
- zenml/zen_stores/migrations/versions/5994f9ad0489_introduce_role_permissions.py +3 -2
- zenml/zen_stores/migrations/versions/6917bce75069_add_pipeline_run_unique_constraint.py +4 -4
- zenml/zen_stores/migrations/versions/728c6369cfaa_add_name_column_to_input_artifact_pk.py +3 -2
- zenml/zen_stores/migrations/versions/743ec82b1b3c_update_size_of_build_images.py +2 -2
- zenml/zen_stores/migrations/versions/7500f434b71c_remove_shared_columns.py +3 -2
- zenml/zen_stores/migrations/versions/7834208cc3f6_artifact_project_scoping.py +8 -7
- zenml/zen_stores/migrations/versions/7b651bf6822e_track_secrets_in_db.py +6 -4
- zenml/zen_stores/migrations/versions/7e4a481d17f7_add_identity_table.py +2 -2
- zenml/zen_stores/migrations/versions/7f603e583dd7_fixed_migration.py +1 -1
- zenml/zen_stores/migrations/versions/a39c4184c8ce_remove_secrets_manager_flavors.py +2 -2
- zenml/zen_stores/migrations/versions/a91762e6be36_artifact_version_table.py +4 -4
- zenml/zen_stores/migrations/versions/alembic_start.py +1 -1
- zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py +4 -4
- zenml/zen_stores/rest_zen_store.py +109 -49
- zenml/zen_stores/schemas/api_key_schemas.py +1 -1
- zenml/zen_stores/schemas/artifact_schemas.py +8 -8
- zenml/zen_stores/schemas/artifact_visualization_schemas.py +3 -3
- zenml/zen_stores/schemas/code_repository_schemas.py +1 -1
- zenml/zen_stores/schemas/component_schemas.py +8 -3
- zenml/zen_stores/schemas/device_schemas.py +8 -6
- zenml/zen_stores/schemas/event_source_schemas.py +3 -4
- zenml/zen_stores/schemas/flavor_schemas.py +5 -3
- zenml/zen_stores/schemas/model_schemas.py +26 -1
- zenml/zen_stores/schemas/pipeline_build_schemas.py +1 -1
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +4 -4
- zenml/zen_stores/schemas/pipeline_run_schemas.py +6 -6
- zenml/zen_stores/schemas/pipeline_schemas.py +5 -2
- zenml/zen_stores/schemas/run_metadata_schemas.py +2 -2
- zenml/zen_stores/schemas/secret_schemas.py +8 -5
- zenml/zen_stores/schemas/server_settings_schemas.py +3 -1
- zenml/zen_stores/schemas/service_connector_schemas.py +1 -1
- zenml/zen_stores/schemas/service_schemas.py +11 -2
- zenml/zen_stores/schemas/stack_schemas.py +1 -1
- zenml/zen_stores/schemas/step_run_schemas.py +11 -11
- zenml/zen_stores/schemas/tag_schemas.py +6 -2
- zenml/zen_stores/schemas/trigger_schemas.py +2 -2
- zenml/zen_stores/schemas/user_schemas.py +2 -2
- zenml/zen_stores/schemas/workspace_schemas.py +3 -1
- zenml/zen_stores/secrets_stores/aws_secrets_store.py +19 -20
- zenml/zen_stores/secrets_stores/azure_secrets_store.py +17 -20
- zenml/zen_stores/secrets_stores/base_secrets_store.py +79 -12
- zenml/zen_stores/secrets_stores/gcp_secrets_store.py +17 -20
- zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py +4 -8
- zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +10 -7
- zenml/zen_stores/secrets_stores/sql_secrets_store.py +5 -6
- zenml/zen_stores/sql_zen_store.py +196 -120
- zenml/zen_stores/zen_store_interface.py +33 -0
- {zenml_nightly-0.58.2.dev20240617.dist-info → zenml_nightly-0.58.2.dev20240619.dist-info}/METADATA +9 -7
- {zenml_nightly-0.58.2.dev20240617.dist-info → zenml_nightly-0.58.2.dev20240619.dist-info}/RECORD +309 -306
- zenml/integrations/kubeflow/utils.py +0 -95
- zenml/models/v2/base/internal.py +0 -37
- zenml/models/v2/base/update.py +0 -44
- {zenml_nightly-0.58.2.dev20240617.dist-info → zenml_nightly-0.58.2.dev20240619.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.58.2.dev20240617.dist-info → zenml_nightly-0.58.2.dev20240619.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.58.2.dev20240617.dist-info → zenml_nightly-0.58.2.dev20240619.dist-info}/entry_points.txt +0 -0
@@ -58,7 +58,7 @@ class KubernetesOrchestratorSettings(BaseSettings):
|
|
58
58
|
orchestrator_pod_settings: Optional[KubernetesPodSettings] = None
|
59
59
|
|
60
60
|
|
61
|
-
class KubernetesOrchestratorConfig(
|
61
|
+
class KubernetesOrchestratorConfig(
|
62
62
|
BaseOrchestratorConfig, KubernetesOrchestratorSettings
|
63
63
|
):
|
64
64
|
"""Configuration for the Kubernetes orchestrator.
|
@@ -100,8 +100,17 @@ def main() -> None:
|
|
100
100
|
)
|
101
101
|
|
102
102
|
step_config = deployment_config.step_configurations[step_name].config
|
103
|
-
|
104
|
-
|
103
|
+
|
104
|
+
kubernetes_settings = step_config.settings.get(
|
105
|
+
"orchestrator.kubernetes", None
|
106
|
+
)
|
107
|
+
|
108
|
+
orchestrator_settings = {}
|
109
|
+
if kubernetes_settings is not None:
|
110
|
+
orchestrator_settings = kubernetes_settings.model_dump()
|
111
|
+
|
112
|
+
settings = KubernetesOrchestratorSettings.model_validate(
|
113
|
+
orchestrator_settings
|
105
114
|
)
|
106
115
|
|
107
116
|
env = get_config_environment_vars()
|
@@ -13,22 +13,13 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Kubernetes pod settings."""
|
15
15
|
|
16
|
-
from typing import
|
16
|
+
from typing import Any, Dict, List
|
17
17
|
|
18
|
-
from pydantic import
|
18
|
+
from pydantic import field_validator
|
19
19
|
|
20
20
|
from zenml.config.base_settings import BaseSettings
|
21
21
|
from zenml.integrations.kubernetes import serialization_utils
|
22
22
|
|
23
|
-
if TYPE_CHECKING:
|
24
|
-
from kubernetes.client.models import (
|
25
|
-
V1Affinity,
|
26
|
-
V1ResourceRequirements,
|
27
|
-
V1Toleration,
|
28
|
-
V1Volume,
|
29
|
-
V1VolumeMount,
|
30
|
-
)
|
31
|
-
|
32
23
|
|
33
24
|
class KubernetesPodSettings(BaseSettings):
|
34
25
|
"""Kubernetes Pod settings.
|
@@ -53,10 +44,9 @@ class KubernetesPodSettings(BaseSettings):
|
|
53
44
|
volume_mounts: List[Dict[str, Any]] = []
|
54
45
|
host_ipc: bool = False
|
55
46
|
|
56
|
-
@
|
57
|
-
|
58
|
-
|
59
|
-
) -> List[Dict[str, Any]]:
|
47
|
+
@field_validator("volumes", mode="before")
|
48
|
+
@classmethod
|
49
|
+
def _convert_volumes(cls, value: Any) -> Any:
|
60
50
|
"""Converts Kubernetes volumes to dicts.
|
61
51
|
|
62
52
|
Args:
|
@@ -78,10 +68,9 @@ class KubernetesPodSettings(BaseSettings):
|
|
78
68
|
|
79
69
|
return result
|
80
70
|
|
81
|
-
@
|
82
|
-
|
83
|
-
|
84
|
-
) -> List[Dict[str, Any]]:
|
71
|
+
@field_validator("volume_mounts", mode="before")
|
72
|
+
@classmethod
|
73
|
+
def _convert_volume_mounts(cls, value: Any) -> Any:
|
85
74
|
"""Converts Kubernetes volume mounts to dicts.
|
86
75
|
|
87
76
|
Args:
|
@@ -103,10 +92,9 @@ class KubernetesPodSettings(BaseSettings):
|
|
103
92
|
|
104
93
|
return result
|
105
94
|
|
106
|
-
@
|
107
|
-
|
108
|
-
|
109
|
-
) -> Dict[str, Any]:
|
95
|
+
@field_validator("affinity", mode="before")
|
96
|
+
@classmethod
|
97
|
+
def _convert_affinity(cls, value: Any) -> Any:
|
110
98
|
"""Converts Kubernetes affinity to a dict.
|
111
99
|
|
112
100
|
Args:
|
@@ -122,10 +110,9 @@ class KubernetesPodSettings(BaseSettings):
|
|
122
110
|
else:
|
123
111
|
return value
|
124
112
|
|
125
|
-
@
|
126
|
-
|
127
|
-
|
128
|
-
) -> List[Dict[str, Any]]:
|
113
|
+
@field_validator("tolerations", mode="before")
|
114
|
+
@classmethod
|
115
|
+
def _convert_tolerations(cls, value: Any) -> Any:
|
129
116
|
"""Converts Kubernetes tolerations to dicts.
|
130
117
|
|
131
118
|
Args:
|
@@ -147,10 +134,9 @@ class KubernetesPodSettings(BaseSettings):
|
|
147
134
|
|
148
135
|
return result
|
149
136
|
|
150
|
-
@
|
151
|
-
|
152
|
-
|
153
|
-
) -> Dict[str, Any]:
|
137
|
+
@field_validator("resources", mode="before")
|
138
|
+
@classmethod
|
139
|
+
def _convert_resources(cls, value: Any) -> Any:
|
154
140
|
"""Converts Kubernetes resource requirements to a dict.
|
155
141
|
|
156
142
|
Args:
|
@@ -25,7 +25,7 @@ from typing import Any, List, Optional
|
|
25
25
|
|
26
26
|
from kubernetes import client as k8s_client
|
27
27
|
from kubernetes import config as k8s_config
|
28
|
-
from pydantic import Field
|
28
|
+
from pydantic import Field
|
29
29
|
|
30
30
|
from zenml.constants import KUBERNETES_CLUSTER_RESOURCE_TYPE
|
31
31
|
from zenml.exceptions import AuthorizationException
|
@@ -40,6 +40,7 @@ from zenml.service_connectors.service_connector import (
|
|
40
40
|
ServiceConnector,
|
41
41
|
)
|
42
42
|
from zenml.utils.enum_utils import StrEnum
|
43
|
+
from zenml.utils.secret_utils import PlainSerializedSecretStr
|
43
44
|
|
44
45
|
logger = get_logger(__name__)
|
45
46
|
|
@@ -47,7 +48,7 @@ logger = get_logger(__name__)
|
|
47
48
|
class KubernetesServerCredentials(AuthenticationConfig):
|
48
49
|
"""Kubernetes server authentication config."""
|
49
50
|
|
50
|
-
certificate_authority: Optional[
|
51
|
+
certificate_authority: Optional[PlainSerializedSecretStr] = Field(
|
51
52
|
default=None,
|
52
53
|
title="Kubernetes CA Certificate (base64 encoded)",
|
53
54
|
)
|
@@ -68,10 +69,10 @@ class KubernetesServerConfig(KubernetesServerCredentials):
|
|
68
69
|
class KubernetesUserPasswordCredentials(AuthenticationConfig):
|
69
70
|
"""Kubernetes user/pass authentication config."""
|
70
71
|
|
71
|
-
username:
|
72
|
+
username: PlainSerializedSecretStr = Field(
|
72
73
|
title="Kubernetes Username",
|
73
74
|
)
|
74
|
-
password:
|
75
|
+
password: PlainSerializedSecretStr = Field(
|
75
76
|
title="Kubernetes Password",
|
76
77
|
)
|
77
78
|
|
@@ -94,15 +95,15 @@ class KubernetesUserPasswordConfig(
|
|
94
95
|
class KubernetesTokenCredentials(AuthenticationConfig):
|
95
96
|
"""Kubernetes token authentication config."""
|
96
97
|
|
97
|
-
client_certificate: Optional[
|
98
|
+
client_certificate: Optional[PlainSerializedSecretStr] = Field(
|
98
99
|
default=None,
|
99
100
|
title="Kubernetes Client Certificate (base64 encoded)",
|
100
101
|
)
|
101
|
-
client_key: Optional[
|
102
|
+
client_key: Optional[PlainSerializedSecretStr] = Field(
|
102
103
|
default=None,
|
103
104
|
title="Kubernetes Client Key (base64 encoded)",
|
104
105
|
)
|
105
|
-
token: Optional[
|
106
|
+
token: Optional[PlainSerializedSecretStr] = Field(
|
106
107
|
default=None,
|
107
108
|
title="Kubernetes Token",
|
108
109
|
)
|
@@ -14,7 +14,6 @@
|
|
14
14
|
"""Initialization of the Label Studio integration."""
|
15
15
|
from typing import List, Type
|
16
16
|
|
17
|
-
from zenml.enums import StackComponentType
|
18
17
|
from zenml.integrations.constants import LABEL_STUDIO
|
19
18
|
from zenml.integrations.integration import Integration
|
20
19
|
from zenml.stack import Flavor
|
@@ -27,8 +26,7 @@ class LabelStudioIntegration(Integration):
|
|
27
26
|
|
28
27
|
NAME = LABEL_STUDIO
|
29
28
|
REQUIREMENTS = [
|
30
|
-
"label-studio>=1.
|
31
|
-
"label-studio-sdk>=0.0.17,<=0.0.32",
|
29
|
+
"label-studio-sdk>=1.0.0",
|
32
30
|
]
|
33
31
|
|
34
32
|
@classmethod
|
@@ -178,13 +178,12 @@ class LabelStudioAnnotator(BaseAnnotator, AuthenticationMixin):
|
|
178
178
|
else:
|
179
179
|
api_key = settings.api_key
|
180
180
|
except RuntimeError:
|
181
|
-
|
182
|
-
|
183
|
-
|
181
|
+
if secret := self.get_authentication_secret():
|
182
|
+
api_key = secret.secret_values.get("api_key", "")
|
183
|
+
else:
|
184
184
|
raise ValueError(
|
185
185
|
"Unable to access predefined secret to access Label Studio API key."
|
186
186
|
)
|
187
|
-
api_key = secret.secret_values.get("api_key", "")
|
188
187
|
if not api_key:
|
189
188
|
raise ValueError(
|
190
189
|
"Unable to access Label Studio API key from secret."
|
@@ -43,10 +43,10 @@ class LabelStudioAnnotatorSettings(BaseSettings):
|
|
43
43
|
|
44
44
|
instance_url: str = DEFAULT_LOCAL_INSTANCE_URL
|
45
45
|
port: Optional[int] = DEFAULT_LOCAL_LABEL_STUDIO_PORT
|
46
|
-
api_key: Optional[str] = SecretField()
|
46
|
+
api_key: Optional[str] = SecretField(default=None)
|
47
47
|
|
48
48
|
|
49
|
-
class LabelStudioAnnotatorConfig(
|
49
|
+
class LabelStudioAnnotatorConfig(
|
50
50
|
BaseAnnotatorConfig,
|
51
51
|
LabelStudioAnnotatorSettings,
|
52
52
|
AuthenticationConfigMixin,
|
@@ -25,7 +25,11 @@ class LangchainIntegration(Integration):
|
|
25
25
|
"""Definition of langchain integration for ZenML."""
|
26
26
|
|
27
27
|
NAME = LANGCHAIN
|
28
|
-
REQUIREMENTS = [
|
28
|
+
REQUIREMENTS = [
|
29
|
+
"langchain==0.0.325",
|
30
|
+
"pyyaml>=6.0.1",
|
31
|
+
"tenacity!=8.4.0", # https://github.com/jd/tenacity/issues/471
|
32
|
+
]
|
29
33
|
|
30
34
|
@classmethod
|
31
35
|
def activate(cls) -> None:
|
@@ -13,20 +13,56 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Implementation of ZenML's Langchain Document materializer."""
|
15
15
|
|
16
|
-
import
|
17
|
-
from typing import TYPE_CHECKING, Any, ClassVar, Tuple, Type
|
16
|
+
import os
|
17
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Dict, Tuple, Type
|
18
|
+
|
19
|
+
from langchain.docstore.document import Document
|
18
20
|
|
19
21
|
from zenml.enums import ArtifactType
|
20
|
-
from zenml.materializers.
|
22
|
+
from zenml.materializers.base_materializer import BaseMaterializer
|
23
|
+
from zenml.utils import yaml_utils
|
24
|
+
|
25
|
+
if TYPE_CHECKING:
|
26
|
+
from zenml.metadata.metadata_types import MetadataType
|
21
27
|
|
22
|
-
|
23
|
-
Document = Any
|
24
|
-
else:
|
25
|
-
from langchain.docstore.document import Document
|
28
|
+
DEFAULT_FILENAME = "data.json"
|
26
29
|
|
27
30
|
|
28
|
-
class LangchainDocumentMaterializer(
|
31
|
+
class LangchainDocumentMaterializer(BaseMaterializer):
|
29
32
|
"""Handle Langchain Document objects."""
|
30
33
|
|
31
34
|
ASSOCIATED_ARTIFACT_TYPE: ClassVar[ArtifactType] = ArtifactType.DATA
|
32
35
|
ASSOCIATED_TYPES: ClassVar[Tuple[Type[Any], ...]] = (Document,)
|
36
|
+
|
37
|
+
def load(self, data_type: Type["Document"]) -> Any:
|
38
|
+
"""Reads BaseModel from JSON.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
data_type: The type of the data to read.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
The data read.
|
45
|
+
"""
|
46
|
+
data_path = os.path.join(self.uri, DEFAULT_FILENAME)
|
47
|
+
contents = yaml_utils.read_json(data_path)
|
48
|
+
return data_type.parse_raw(contents)
|
49
|
+
|
50
|
+
def save(self, data: "Document") -> None:
|
51
|
+
"""Serialize a BaseModel to JSON.
|
52
|
+
|
53
|
+
Args:
|
54
|
+
data: The data to store.
|
55
|
+
"""
|
56
|
+
data_path = os.path.join(self.uri, DEFAULT_FILENAME)
|
57
|
+
yaml_utils.write_json(data_path, data.json())
|
58
|
+
|
59
|
+
def extract_metadata(self, data: Document) -> Dict[str, "MetadataType"]:
|
60
|
+
"""Extract metadata from the given BaseModel object.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
data: The BaseModel object to extract metadata from.
|
64
|
+
|
65
|
+
Returns:
|
66
|
+
The extracted metadata as a dictionary.
|
67
|
+
"""
|
68
|
+
return {"schema": data.schema()}
|
@@ -31,15 +31,21 @@ class MlflowIntegration(Integration):
|
|
31
31
|
"""Definition of MLflow integration for ZenML."""
|
32
32
|
|
33
33
|
NAME = MLFLOW
|
34
|
-
|
35
|
-
# does not pin it. They fixed this in a later version, so we can probably
|
36
|
-
# remove this once we update the mlflow version.
|
34
|
+
|
37
35
|
REQUIREMENTS = [
|
38
36
|
"mlflow>=2.1.1,<=2.12.2",
|
39
37
|
"mlserver>=1.3.3",
|
40
38
|
"mlserver-mlflow>=1.3.3",
|
41
39
|
# TODO: remove this requirement once rapidjson is fixed
|
42
40
|
"python-rapidjson<1.15",
|
41
|
+
# When you do:
|
42
|
+
# pip install zenml
|
43
|
+
# You get all our required dependencies. However, if you follow it with:
|
44
|
+
# zenml integration install mlflow
|
45
|
+
# This downgrades pydantic to v1 even though mlflow does not have
|
46
|
+
# any issues with v2. This is why we have to pin it here so a downgrade
|
47
|
+
# will not happen.
|
48
|
+
"pydantic>=2.7.0,<2.8.0"
|
43
49
|
]
|
44
50
|
|
45
51
|
@classmethod
|
@@ -173,7 +173,7 @@ class MLFlowExperimentTracker(BaseExperimentTracker):
|
|
173
173
|
if as_plain_text:
|
174
174
|
tracking_uri = self.config.tracking_uri
|
175
175
|
else:
|
176
|
-
tracking_uri = self.config.
|
176
|
+
tracking_uri = self.config.model_dump()["tracking_uri"]
|
177
177
|
return tracking_uri or self._local_mlflow_backend()
|
178
178
|
|
179
179
|
def prepare_step_run(self, info: "StepRunInfo") -> None:
|
@@ -15,7 +15,7 @@
|
|
15
15
|
|
16
16
|
from typing import TYPE_CHECKING, Any, Dict, Optional, Type
|
17
17
|
|
18
|
-
from pydantic import
|
18
|
+
from pydantic import model_validator
|
19
19
|
|
20
20
|
from zenml.config.base_settings import BaseSettings
|
21
21
|
from zenml.experiment_trackers.base_experiment_tracker import (
|
@@ -72,7 +72,7 @@ class MLFlowExperimentTrackerSettings(BaseSettings):
|
|
72
72
|
tags: Dict[str, Any] = {}
|
73
73
|
|
74
74
|
|
75
|
-
class MLFlowExperimentTrackerConfig(
|
75
|
+
class MLFlowExperimentTrackerConfig(
|
76
76
|
BaseExperimentTrackerConfig, MLFlowExperimentTrackerSettings
|
77
77
|
):
|
78
78
|
"""Config for the MLflow experiment tracker.
|
@@ -101,69 +101,61 @@ class MLFlowExperimentTrackerConfig( # type: ignore[misc] # https://github.com/
|
|
101
101
|
"""
|
102
102
|
|
103
103
|
tracking_uri: Optional[str] = None
|
104
|
-
tracking_username: Optional[str] = SecretField()
|
105
|
-
tracking_password: Optional[str] = SecretField()
|
106
|
-
tracking_token: Optional[str] = SecretField()
|
104
|
+
tracking_username: Optional[str] = SecretField(default=None)
|
105
|
+
tracking_password: Optional[str] = SecretField(default=None)
|
106
|
+
tracking_token: Optional[str] = SecretField(default=None)
|
107
107
|
tracking_insecure_tls: bool = False
|
108
108
|
databricks_host: Optional[str] = None
|
109
109
|
|
110
|
-
@
|
110
|
+
@model_validator(mode="after")
|
111
111
|
def _ensure_authentication_if_necessary(
|
112
|
-
|
113
|
-
) ->
|
112
|
+
self,
|
113
|
+
) -> "MLFlowExperimentTrackerConfig":
|
114
114
|
"""Ensures that credentials or a token for authentication exist.
|
115
115
|
|
116
116
|
We make this check when running MLflow tracking with a remote backend.
|
117
117
|
|
118
|
-
Args:
|
119
|
-
values: The values to validate.
|
120
|
-
|
121
118
|
Returns:
|
122
119
|
The validated values.
|
123
120
|
|
124
121
|
Raises:
|
125
|
-
|
122
|
+
ValueError: If neither credentials nor a token are provided.
|
126
123
|
"""
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
# host to be set.
|
133
|
-
databricks_host = values.get("databricks_host")
|
134
|
-
|
135
|
-
if not databricks_host:
|
124
|
+
if self.tracking_uri:
|
125
|
+
if is_databricks_tracking_uri(self.tracking_uri):
|
126
|
+
# If the tracking uri is "databricks", then we need the
|
127
|
+
# databricks host to be set.
|
128
|
+
if not self.databricks_host:
|
136
129
|
raise ValueError(
|
137
130
|
"MLflow experiment tracking with a Databricks MLflow "
|
138
|
-
"managed tracking server requires the
|
139
|
-
"to be set in your stack component.
|
140
|
-
"component, run
|
131
|
+
"managed tracking server requires the "
|
132
|
+
"`databricks_host` to be set in your stack component. "
|
133
|
+
"To update your component, run "
|
134
|
+
"`zenml experiment-tracker update "
|
141
135
|
"<NAME> --databricks_host=DATABRICKS_HOST` "
|
142
136
|
"and specify the hostname of your Databricks workspace."
|
143
137
|
)
|
144
138
|
|
145
|
-
if is_remote_mlflow_tracking_uri(tracking_uri):
|
146
|
-
# we need either username + password or a token to authenticate
|
147
|
-
# the remote backend
|
148
|
-
basic_auth =
|
149
|
-
"tracking_password"
|
150
|
-
)
|
151
|
-
token_auth = values.get("tracking_token")
|
139
|
+
if is_remote_mlflow_tracking_uri(self.tracking_uri):
|
140
|
+
# we need either username + password or a token to authenticate
|
141
|
+
# to the remote backend
|
142
|
+
basic_auth = self.tracking_username and self.tracking_password
|
152
143
|
|
153
|
-
if not (basic_auth or
|
144
|
+
if not (basic_auth or self.tracking_token):
|
154
145
|
raise ValueError(
|
155
146
|
f"MLflow experiment tracking with a remote backend "
|
156
|
-
f"{tracking_uri} is only possible when specifying
|
157
|
-
f"username and password or an authentication
|
158
|
-
f"stack component. To update your
|
159
|
-
f"following command:
|
147
|
+
f"{self.tracking_uri} is only possible when specifying "
|
148
|
+
f"either username and password or an authentication "
|
149
|
+
f"token in your stack component. To update your "
|
150
|
+
f"component, run the following command: "
|
151
|
+
f"`zenml experiment-tracker update "
|
160
152
|
f"<NAME> --tracking_username=MY_USERNAME "
|
161
153
|
f"--tracking_password=MY_PASSWORD "
|
162
154
|
f"--tracking_token=MY_TOKEN` and specify either your "
|
163
155
|
f"username and password or token."
|
164
156
|
)
|
165
157
|
|
166
|
-
return
|
158
|
+
return self
|
167
159
|
|
168
160
|
@property
|
169
161
|
def is_local(self) -> bool:
|
@@ -385,7 +385,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
|
|
385
385
|
f"Registering a new version for the model `'{name}'` "
|
386
386
|
f"a version will be assigned automatically."
|
387
387
|
)
|
388
|
-
metadata_dict = metadata.
|
388
|
+
metadata_dict = metadata.model_dump() if metadata else {}
|
389
389
|
# Set the run ID and link.
|
390
390
|
run_id = metadata_dict.get("mlflow_run_id", None)
|
391
391
|
run_link = metadata_dict.get("mlflow_run_link", None)
|
@@ -477,7 +477,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
|
|
477
477
|
# Update the model tags.
|
478
478
|
if metadata:
|
479
479
|
try:
|
480
|
-
for key, value in metadata.
|
480
|
+
for key, value in metadata.model_dump().items():
|
481
481
|
self.mlflow_client.set_model_version_tag(
|
482
482
|
name=name,
|
483
483
|
version=version,
|
@@ -593,7 +593,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
|
|
593
593
|
filter_string += " AND "
|
594
594
|
filter_string += f"run_id='{kwargs['mlflow_run_id']}'"
|
595
595
|
if metadata:
|
596
|
-
for tag, value in metadata.
|
596
|
+
for tag, value in metadata.model_dump().items():
|
597
597
|
if value:
|
598
598
|
if filter_string:
|
599
599
|
filter_string += " AND "
|
@@ -737,7 +737,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
|
|
737
737
|
registered_model=RegisteredModel(name=mlflow_model_version.name),
|
738
738
|
model_format=MLFLOW_MODEL_FORMAT,
|
739
739
|
model_library=model_library,
|
740
|
-
version=mlflow_model_version.version,
|
740
|
+
version=str(mlflow_model_version.version),
|
741
741
|
created_at=datetime.fromtimestamp(
|
742
742
|
int(mlflow_model_version.creation_timestamp) / 1e3
|
743
743
|
),
|
@@ -130,7 +130,7 @@ def mlflow_model_deployer_step(
|
|
130
130
|
|
131
131
|
# Fetch existing services with same pipeline name, step name and model name
|
132
132
|
existing_services = model_deployer.find_model_server(
|
133
|
-
config=predictor_cfg.
|
133
|
+
config=predictor_cfg.model_dump(),
|
134
134
|
)
|
135
135
|
|
136
136
|
# Check whether to deploy a new service
|
@@ -47,7 +47,7 @@ class NeptuneExperimentTrackerConfig(BaseExperimentTrackerConfig):
|
|
47
47
|
"""
|
48
48
|
|
49
49
|
project: Optional[str] = None
|
50
|
-
api_token: Optional[str] = SecretField()
|
50
|
+
api_token: Optional[str] = SecretField(default=None)
|
51
51
|
|
52
52
|
|
53
53
|
class NeptuneExperimentTrackerSettings(BaseSettings):
|
@@ -21,7 +21,11 @@ class NeuralProphetIntegration(Integration):
|
|
21
21
|
"""Definition of NeuralProphet integration for ZenML."""
|
22
22
|
|
23
23
|
NAME = NEURAL_PROPHET
|
24
|
-
REQUIREMENTS = [
|
24
|
+
REQUIREMENTS = [
|
25
|
+
"neuralprophet>=0.3.2,<0.5.0",
|
26
|
+
"holidays>=0.4.1,<0.25.0",
|
27
|
+
"tenacity!=8.4.0", # https://github.com/jd/tenacity/issues/471
|
28
|
+
]
|
25
29
|
|
26
30
|
@classmethod
|
27
31
|
def activate(cls) -> None:
|
@@ -31,7 +31,7 @@ class PigeonAnnotatorSettings(BaseSettings):
|
|
31
31
|
"""Settings for the Pigeon annotator."""
|
32
32
|
|
33
33
|
|
34
|
-
class PigeonAnnotatorConfig(
|
34
|
+
class PigeonAnnotatorConfig(
|
35
35
|
BaseAnnotatorConfig, PigeonAnnotatorSettings, AuthenticationConfigMixin
|
36
36
|
):
|
37
37
|
"""Config for the Pigeon annotator.
|
@@ -24,7 +24,7 @@ from typing import (
|
|
24
24
|
Type,
|
25
25
|
)
|
26
26
|
|
27
|
-
from pydantic import
|
27
|
+
from pydantic import field_validator
|
28
28
|
|
29
29
|
from zenml.artifact_stores import (
|
30
30
|
BaseArtifactStoreConfig,
|
@@ -63,14 +63,15 @@ class S3ArtifactStoreConfig(
|
|
63
63
|
|
64
64
|
SUPPORTED_SCHEMES: ClassVar[Set[str]] = {"s3://"}
|
65
65
|
|
66
|
-
key: Optional[str] = SecretField()
|
67
|
-
secret: Optional[str] = SecretField()
|
68
|
-
token: Optional[str] = SecretField()
|
66
|
+
key: Optional[str] = SecretField(default=None)
|
67
|
+
secret: Optional[str] = SecretField(default=None)
|
68
|
+
token: Optional[str] = SecretField(default=None)
|
69
69
|
client_kwargs: Optional[Dict[str, Any]] = None
|
70
70
|
config_kwargs: Optional[Dict[str, Any]] = None
|
71
71
|
s3_additional_kwargs: Optional[Dict[str, Any]] = None
|
72
72
|
|
73
|
-
@
|
73
|
+
@field_validator("client_kwargs")
|
74
|
+
@classmethod
|
74
75
|
def _validate_client_kwargs(
|
75
76
|
cls, value: Optional[Dict[str, Any]]
|
76
77
|
) -> Optional[Dict[str, Any]]:
|
@@ -138,7 +139,7 @@ class S3ArtifactStoreFlavor(BaseArtifactStoreFlavor):
|
|
138
139
|
|
139
140
|
@property
|
140
141
|
def docs_url(self) -> Optional[str]:
|
141
|
-
"""A
|
142
|
+
"""A URL to point at docs explaining this flavor.
|
142
143
|
|
143
144
|
Returns:
|
144
145
|
A flavor docs url.
|
@@ -147,7 +148,7 @@ class S3ArtifactStoreFlavor(BaseArtifactStoreFlavor):
|
|
147
148
|
|
148
149
|
@property
|
149
150
|
def sdk_docs_url(self) -> Optional[str]:
|
150
|
-
"""A
|
151
|
+
"""A URL to point at SDK docs explaining this flavor.
|
151
152
|
|
152
153
|
Returns:
|
153
154
|
A flavor SDK docs url.
|
@@ -156,7 +157,7 @@ class S3ArtifactStoreFlavor(BaseArtifactStoreFlavor):
|
|
156
157
|
|
157
158
|
@property
|
158
159
|
def logo_url(self) -> str:
|
159
|
-
"""A
|
160
|
+
"""A URL to represent the flavor in the dashboard.
|
160
161
|
|
161
162
|
Returns:
|
162
163
|
The flavor logo.
|