zenml-nightly 0.80.2.dev20250415__py3-none-any.whl → 0.81.0.dev20250417__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/cli/utils.py +13 -11
- zenml/config/compiler.py +1 -0
- zenml/config/global_config.py +1 -1
- zenml/config/pipeline_configurations.py +1 -0
- zenml/config/pipeline_run_configuration.py +1 -0
- zenml/constants.py +4 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +47 -5
- zenml/integrations/gcp/vertex_custom_job_parameters.py +15 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +0 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +0 -1
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +0 -3
- zenml/logging/step_logging.py +41 -21
- zenml/login/credentials_store.py +31 -0
- zenml/models/v2/base/base.py +8 -4
- zenml/models/v2/base/filter.py +1 -1
- zenml/models/v2/core/pipeline_run.py +19 -0
- zenml/orchestrators/step_launcher.py +2 -3
- zenml/orchestrators/step_runner.py +2 -2
- zenml/orchestrators/utils.py +2 -5
- zenml/pipelines/pipeline_context.py +1 -0
- zenml/pipelines/pipeline_decorator.py +4 -0
- zenml/pipelines/pipeline_definition.py +83 -22
- zenml/pipelines/run_utils.py +4 -0
- zenml/steps/utils.py +1 -1
- zenml/zen_server/auth.py +44 -64
- zenml/zen_server/dashboard/assets/{404-CYPi9d8E.js → 404-o3nB5iwI.js} +1 -1
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-Dn8bgaXG.js → AlertDialogDropdownItem-C_qWs-4u.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-CSINAl3I.js → CodeSnippet-nRnOvbOJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-CQOb53t9.js → CollapsibleCard-9sSz7n1R.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-CPleXvse.js → Commands-BwBzFj-5.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-CIFj0W7T.js → ComponentBadge-CMx2DbsV.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentIcon-D3JHFhJU.js → ComponentIcon-CSxdApv8.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-Cklc1Vb5.js → CsvVizualization-lxB2iyEh.js} +1 -1
- zenml/zen_server/dashboard/assets/{DeleteAlertDialog-Bzq-uSd7.js → DeleteAlertDialog-Bp0o-UXZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{DialogItem-zjMgCmCl.js → DialogItem-DHw2ihTx.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-kdeNHm_o.js → Error-DRhVeVHQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-UE6Rbmtk.js → ExecutionStatus-HnZXi9bW.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-CeM-FPQl.js → Helpbox-Dsr3ZYcL.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-CD0fDbYF.js → Infobox-C4Op55B8.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-CrHWwlf4.js → InlineAvatar-CrAwe7Pl.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DfTTGG8u.js → NestedCollapsible-Ce1bmT8N.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-DggkUpWp.js → Partials-DjTM0Oe-.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProBadge-BCdprj69.js → ProBadge-CDEqgzh8.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-szzPO0Y7.js → ProCta-BYSSivgY.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-MdqWDO6-.js → ProviderIcon-B8W7AGNk.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-B4CB4vzP.js → ProviderRadio-BWFJPEY2.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunSelector-Bhb83FyB.js → RunSelector-DoL_gMHJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunsBody-Csn2VEOE.js → RunsBody-B6mBjv-_.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-Cce00eQL.js → SearchField-DHl5flXv.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-DaDLBVj-.js → SecretTooltip-CCn9HfEh.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-tX6fom1Y.js → SetPassword-BDFVwnNB.js} +1 -1
- zenml/zen_server/dashboard/assets/{StackList-CQt1xGRh.js → StackList-dhdUtky3.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tabs-CCQyIqRb.js → Tabs-BuZG8ft1.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-D63_jhf1.js → Tick-C4gtED35.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-CbbvoGYV.js → UpdatePasswordSchemas-3gg2tC-H.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-C2cNrUeS.js → UsageReason-DOMAzO02.js} +1 -1
- zenml/zen_server/dashboard/assets/{Wizard-BVkN2a2x.js → Wizard-BSH_lIfi.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-Bk7gIKiS.js → WizardFooter-CnM-50jL.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-BLclwQSi.js → all-pipeline-runs-query-D9XfZpmV.js} +1 -1
- zenml/zen_server/dashboard/assets/{configuration-form-CjrAp0GS.js → configuration-form-Ci_QlfZC.js} +1 -1
- zenml/zen_server/dashboard/assets/{create-stack-Bd2JdQer.js → create-stack-CoQ5SEJL.js} +1 -1
- zenml/zen_server/dashboard/assets/{delete-run-Cwpxu1-d.js → delete-run-B5xUZwdP.js} +1 -1
- zenml/zen_server/dashboard/assets/{flavor-select-c0w-6o9w.js → flavor-select-DOLAl-S4.js} +1 -1
- zenml/zen_server/dashboard/assets/{form-schemas-B5Ax1SZf.js → form-schemas-BaEJ1z87.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BW-KaQ2p.js → index-BoWZ9rXk.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CjdtNrfJ.js → index-e8udi7QT.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-Be2jLIYM.js → index-hsSXyS3H.js} +2 -2
- zenml/zen_server/dashboard/assets/{index-d_40qKeY.js → index-ojAuWXMf.js} +1 -1
- zenml/zen_server/dashboard/assets/{login-mutation-DOajKct8.js → login-mutation-CwraNa5G.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-DolTp0dr.js → not-found-BuK1QrF2.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-C4zMMcaH.js → page-0AIX3VK8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BkPPfNfG.js → page-3lW9eIer.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9PzQok8O.js +1 -0
- zenml/zen_server/dashboard/assets/{page-bS5tHLDW.js → page-B5clbTo4.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BRfeowe0.js → page-BEibNYiA.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CmzmFF4S.js → page-BOE2XBFy.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DmOcZO8U.js → page-BQVPbNps.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D3m9-YWJ.js → page-BbygQpf-.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CKVbEdX2.js → page-Bki79xdd.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Dv3qtvm8.js → page-BnKwJnOb.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-ir7Scz2Y.js → page-C-6XUKSp.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-48DMcIQw.js → page-C30HZCTR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BmTf1Lf1.js → page-C7buw8xJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CwAbTnvK.js → page-CBGeo-7W.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-BEAx6ZvH.js → page-CIDo1Ajk.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CaTJVICi.js → page-CZgeF_wQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DCpZju6a.js → page-CgJcperk.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-gRfUvR0E.js → page-CjRoKEQs.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DWOAh8Pp.js → page-Co-FJ5ds.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D-MjLTXS.js → page-Cu8vuohQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-mtwS5oci.js → page-Czj8fu8q.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-hNHJPQtK.js → page-D0QcEBi1.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CPRymOIS.js → page-DHDeVaMO.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-B32kCGPe.js → page-DKY_U5Sz.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BiAjLLww.js → page-DLVtrRa5.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DEUeF3mO.js → page-DQHU5o_C.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BbRtQC2E.js → page-DbEn9V9E.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DezabeEO.js → page-DpY1koQY.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-P81CcE2L.js → page-DrS4WOup.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BuZC8z6N.js → page-DwIlrsF0.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DnY59jOg.js → page-HIAPXq4w.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BgUR_5z3.js → page-Jw2QAdxa.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DivlNKt9.js → page-KRP_w5zH.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-a1c6o4vv.js → page-_Zt6UwiG.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BBNrvxC1.js → page-hVng6ANV.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-BUqILw7G.js → persist-DLvsEXh0.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-BbdfLc0W.js → persist-xOAq24Bm.js} +1 -1
- zenml/zen_server/dashboard/assets/{service-CV2zjc-p.js → service-MHyqhRgp.js} +1 -1
- zenml/zen_server/dashboard/assets/{sharedSchema-DpGc9kQg.js → sharedSchema-CQA5lnlU.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-BpzLZjvw.js → stack-detail-query-C1GoxBeK.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-Dv6qHtK9.js → update-server-settings-mutation-DduehrZn.js} +1 -1
- zenml/zen_server/dashboard/index.html +2 -2
- zenml/zen_server/download_utils.py +26 -29
- zenml/zen_server/jwt.py +0 -14
- zenml/zen_server/routers/auth_endpoints.py +5 -36
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +63 -26
- zenml/zen_server/routers/runs_endpoints.py +57 -0
- zenml/zen_server/template_execution/utils.py +1 -1
- zenml/zen_stores/migrations/versions/0.81.0_release.py +23 -0
- zenml/zen_stores/rest_zen_store.py +16 -13
- zenml/zen_stores/schemas/pipeline_run_schemas.py +1 -0
- zenml/zen_stores/sql_zen_store.py +18 -0
- {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/METADATA +3 -2
- {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/RECORD +128 -127
- zenml/zen_server/dashboard/assets/page-BAjhc2bs.js +0 -1
- {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/entry_points.txt +0 -0
zenml/orchestrators/utils.py
CHANGED
@@ -105,7 +105,6 @@ def is_setting_enabled(
|
|
105
105
|
def get_config_environment_vars(
|
106
106
|
schedule_id: Optional[UUID] = None,
|
107
107
|
pipeline_run_id: Optional[UUID] = None,
|
108
|
-
step_run_id: Optional[UUID] = None,
|
109
108
|
) -> Dict[str, str]:
|
110
109
|
"""Gets environment variables to set for mirroring the active config.
|
111
110
|
|
@@ -119,7 +118,6 @@ def get_config_environment_vars(
|
|
119
118
|
schedule_id: Optional schedule ID to use to generate a new API token.
|
120
119
|
pipeline_run_id: Optional pipeline run ID to use to generate a new API
|
121
120
|
token.
|
122
|
-
step_run_id: Optional step run ID to use to generate a new API token.
|
123
121
|
|
124
122
|
Returns:
|
125
123
|
Environment variable dict.
|
@@ -138,7 +136,7 @@ def get_config_environment_vars(
|
|
138
136
|
credentials_store = get_credentials_store()
|
139
137
|
url = global_config.store_configuration.url
|
140
138
|
api_token = credentials_store.get_token(url, allow_expired=False)
|
141
|
-
if schedule_id or pipeline_run_id
|
139
|
+
if schedule_id or pipeline_run_id:
|
142
140
|
assert isinstance(global_config.zen_store, RestZenStore)
|
143
141
|
|
144
142
|
# The user has the option to manually set an expiration for the API
|
@@ -173,7 +171,7 @@ def get_config_environment_vars(
|
|
173
171
|
# If only a schedule is given, the pipeline run credentials will
|
174
172
|
# be valid for the entire duration of the schedule.
|
175
173
|
api_key = credentials_store.get_api_key(url)
|
176
|
-
if not api_key and not pipeline_run_id
|
174
|
+
if not api_key and not pipeline_run_id:
|
177
175
|
logger.warning(
|
178
176
|
"An API token without an expiration time will be generated "
|
179
177
|
"and used to run this pipeline on a schedule. This is very "
|
@@ -194,7 +192,6 @@ def get_config_environment_vars(
|
|
194
192
|
token_type=APITokenType.WORKLOAD,
|
195
193
|
schedule_id=schedule_id,
|
196
194
|
pipeline_run_id=pipeline_run_id,
|
197
|
-
step_run_id=step_run_id,
|
198
195
|
)
|
199
196
|
|
200
197
|
environment_vars[ENV_ZENML_STORE_PREFIX + "API_TOKEN"] = (
|
@@ -109,6 +109,7 @@ class PipelineContext:
|
|
109
109
|
pipeline_configuration.enable_artifact_visualization
|
110
110
|
)
|
111
111
|
self.enable_step_logs = pipeline_configuration.enable_step_logs
|
112
|
+
self.enable_pipeline_logs = pipeline_configuration.enable_pipeline_logs
|
112
113
|
self.settings = pipeline_configuration.settings
|
113
114
|
self.extra = pipeline_configuration.extra
|
114
115
|
self.model = pipeline_configuration.model
|
@@ -50,6 +50,7 @@ def pipeline(
|
|
50
50
|
enable_cache: Optional[bool] = None,
|
51
51
|
enable_artifact_metadata: Optional[bool] = None,
|
52
52
|
enable_step_logs: Optional[bool] = None,
|
53
|
+
enable_pipeline_logs: Optional[bool] = None,
|
53
54
|
settings: Optional[Dict[str, "SettingsOrDict"]] = None,
|
54
55
|
tags: Optional[List[Union[str, "Tag"]]] = None,
|
55
56
|
extra: Optional[Dict[str, Any]] = None,
|
@@ -67,6 +68,7 @@ def pipeline(
|
|
67
68
|
enable_cache: Optional[bool] = None,
|
68
69
|
enable_artifact_metadata: Optional[bool] = None,
|
69
70
|
enable_step_logs: Optional[bool] = None,
|
71
|
+
enable_pipeline_logs: Optional[bool] = None,
|
70
72
|
settings: Optional[Dict[str, "SettingsOrDict"]] = None,
|
71
73
|
tags: Optional[List[Union[str, "Tag"]]] = None,
|
72
74
|
extra: Optional[Dict[str, Any]] = None,
|
@@ -84,6 +86,7 @@ def pipeline(
|
|
84
86
|
enable_cache: Whether to use caching or not.
|
85
87
|
enable_artifact_metadata: Whether to enable artifact metadata or not.
|
86
88
|
enable_step_logs: If step logs should be enabled for this pipeline.
|
89
|
+
enable_pipeline_logs: If pipeline logs should be enabled for this pipeline.
|
87
90
|
settings: Settings for this pipeline.
|
88
91
|
tags: Tags to apply to runs of the pipeline.
|
89
92
|
extra: Extra configurations for this pipeline.
|
@@ -108,6 +111,7 @@ def pipeline(
|
|
108
111
|
enable_cache=enable_cache,
|
109
112
|
enable_artifact_metadata=enable_artifact_metadata,
|
110
113
|
enable_step_logs=enable_step_logs,
|
114
|
+
enable_pipeline_logs=enable_pipeline_logs,
|
111
115
|
settings=settings,
|
112
116
|
tags=tags,
|
113
117
|
extra=extra,
|
@@ -16,7 +16,7 @@
|
|
16
16
|
import copy
|
17
17
|
import hashlib
|
18
18
|
import inspect
|
19
|
-
from contextlib import contextmanager
|
19
|
+
from contextlib import contextmanager, nullcontext
|
20
20
|
from pathlib import Path
|
21
21
|
from typing import (
|
22
22
|
TYPE_CHECKING,
|
@@ -56,8 +56,13 @@ from zenml.enums import StackComponentType
|
|
56
56
|
from zenml.exceptions import EntityExistsError
|
57
57
|
from zenml.hooks.hook_validators import resolve_and_validate_hook
|
58
58
|
from zenml.logger import get_logger
|
59
|
+
from zenml.logging.step_logging import (
|
60
|
+
PipelineLogsStorageContext,
|
61
|
+
prepare_logs_uri,
|
62
|
+
)
|
59
63
|
from zenml.models import (
|
60
64
|
CodeReferenceRequest,
|
65
|
+
LogsRequest,
|
61
66
|
PipelineBuildBase,
|
62
67
|
PipelineBuildResponse,
|
63
68
|
PipelineDeploymentBase,
|
@@ -130,6 +135,7 @@ class Pipeline:
|
|
130
135
|
enable_artifact_metadata: Optional[bool] = None,
|
131
136
|
enable_artifact_visualization: Optional[bool] = None,
|
132
137
|
enable_step_logs: Optional[bool] = None,
|
138
|
+
enable_pipeline_logs: Optional[bool] = None,
|
133
139
|
settings: Optional[Mapping[str, "SettingsOrDict"]] = None,
|
134
140
|
tags: Optional[List[Union[str, "Tag"]]] = None,
|
135
141
|
extra: Optional[Dict[str, Any]] = None,
|
@@ -149,6 +155,7 @@ class Pipeline:
|
|
149
155
|
enable_artifact_visualization: If artifact visualization should be
|
150
156
|
enabled for this pipeline.
|
151
157
|
enable_step_logs: If step logs should be enabled for this pipeline.
|
158
|
+
enable_pipeline_logs: If pipeline logs should be enabled for this pipeline.
|
152
159
|
settings: Settings for this pipeline.
|
153
160
|
tags: Tags to apply to runs of this pipeline.
|
154
161
|
extra: Extra configurations for this pipeline.
|
@@ -174,6 +181,7 @@ class Pipeline:
|
|
174
181
|
enable_artifact_metadata=enable_artifact_metadata,
|
175
182
|
enable_artifact_visualization=enable_artifact_visualization,
|
176
183
|
enable_step_logs=enable_step_logs,
|
184
|
+
enable_pipeline_logs=enable_pipeline_logs,
|
177
185
|
settings=settings,
|
178
186
|
tags=tags,
|
179
187
|
extra=extra,
|
@@ -293,6 +301,7 @@ class Pipeline:
|
|
293
301
|
enable_artifact_metadata: Optional[bool] = None,
|
294
302
|
enable_artifact_visualization: Optional[bool] = None,
|
295
303
|
enable_step_logs: Optional[bool] = None,
|
304
|
+
enable_pipeline_logs: Optional[bool] = None,
|
296
305
|
settings: Optional[Mapping[str, "SettingsOrDict"]] = None,
|
297
306
|
tags: Optional[List[Union[str, "Tag"]]] = None,
|
298
307
|
extra: Optional[Dict[str, Any]] = None,
|
@@ -322,6 +331,7 @@ class Pipeline:
|
|
322
331
|
enable_artifact_visualization: If artifact visualization should be
|
323
332
|
enabled for this pipeline.
|
324
333
|
enable_step_logs: If step logs should be enabled for this pipeline.
|
334
|
+
enable_pipeline_logs: If pipeline logs should be enabled for this pipeline.
|
325
335
|
settings: settings for this pipeline.
|
326
336
|
tags: Tags to apply to runs of this pipeline.
|
327
337
|
extra: Extra configurations for this pipeline.
|
@@ -364,6 +374,7 @@ class Pipeline:
|
|
364
374
|
"enable_artifact_metadata": enable_artifact_metadata,
|
365
375
|
"enable_artifact_visualization": enable_artifact_visualization,
|
366
376
|
"enable_step_logs": enable_step_logs,
|
377
|
+
"enable_pipeline_logs": enable_pipeline_logs,
|
367
378
|
"settings": settings,
|
368
379
|
"tags": tags,
|
369
380
|
"extra": extra,
|
@@ -588,6 +599,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
|
|
588
599
|
enable_artifact_metadata: Optional[bool] = None,
|
589
600
|
enable_artifact_visualization: Optional[bool] = None,
|
590
601
|
enable_step_logs: Optional[bool] = None,
|
602
|
+
enable_pipeline_logs: Optional[bool] = None,
|
591
603
|
schedule: Optional[Schedule] = None,
|
592
604
|
build: Union[str, "UUID", "PipelineBuildBase", None] = None,
|
593
605
|
settings: Optional[Mapping[str, "SettingsOrDict"]] = None,
|
@@ -610,6 +622,8 @@ To avoid this consider setting pipeline parameters only in one place (config or
|
|
610
622
|
enable_artifact_visualization: If artifact visualization should be
|
611
623
|
enabled for this pipeline run.
|
612
624
|
enable_step_logs: If step logs should be enabled for this pipeline.
|
625
|
+
enable_pipeline_logs: If pipeline logs should be enabled for this
|
626
|
+
pipeline run.
|
613
627
|
schedule: Optional schedule to use for the run.
|
614
628
|
build: Optional build to use for the run.
|
615
629
|
settings: Settings for this pipeline run.
|
@@ -641,6 +655,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
|
|
641
655
|
enable_artifact_metadata=enable_artifact_metadata,
|
642
656
|
enable_artifact_visualization=enable_artifact_visualization,
|
643
657
|
enable_step_logs=enable_step_logs,
|
658
|
+
enable_pipeline_logs=enable_pipeline_logs,
|
644
659
|
steps=step_configurations,
|
645
660
|
settings=settings,
|
646
661
|
schedule=schedule,
|
@@ -723,7 +738,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
|
|
723
738
|
if prevent_build_reuse:
|
724
739
|
logger.warning(
|
725
740
|
"Passing `prevent_build_reuse=True` to "
|
726
|
-
"`pipeline.
|
741
|
+
"`pipeline.with_options(...)` is deprecated. Use "
|
727
742
|
"`DockerSettings.prevent_build_reuse` instead."
|
728
743
|
)
|
729
744
|
|
@@ -806,31 +821,77 @@ To avoid this consider setting pipeline parameters only in one place (config or
|
|
806
821
|
|
807
822
|
with track_handler(AnalyticsEvent.RUN_PIPELINE) as analytics_handler:
|
808
823
|
stack = Client().active_stack
|
809
|
-
deployment = self._create_deployment(**self._run_args)
|
810
824
|
|
811
|
-
|
812
|
-
|
825
|
+
# Enable or disable pipeline run logs storage
|
826
|
+
if self._run_args.get("schedule"):
|
827
|
+
# Pipeline runs scheduled to run in the future are not logged
|
828
|
+
# via the client.
|
829
|
+
logging_enabled = False
|
830
|
+
elif constants.handle_bool_env_var(
|
831
|
+
constants.ENV_ZENML_DISABLE_PIPELINE_LOGS_STORAGE, False
|
832
|
+
):
|
833
|
+
logging_enabled = False
|
834
|
+
else:
|
835
|
+
logging_enabled = self._run_args.get(
|
836
|
+
"enable_pipeline_logs",
|
837
|
+
self.configuration.enable_pipeline_logs
|
838
|
+
if self.configuration.enable_pipeline_logs is not None
|
839
|
+
else True,
|
840
|
+
)
|
813
841
|
|
814
|
-
|
815
|
-
|
816
|
-
stack=stack,
|
817
|
-
run_id=run.id if run else None,
|
818
|
-
)
|
842
|
+
logs_context = nullcontext()
|
843
|
+
logs_model = None
|
819
844
|
|
820
|
-
if
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
845
|
+
if logging_enabled:
|
846
|
+
# Configure the logs
|
847
|
+
logs_uri = prepare_logs_uri(
|
848
|
+
stack.artifact_store,
|
849
|
+
)
|
850
|
+
|
851
|
+
logs_context = PipelineLogsStorageContext(
|
852
|
+
logs_uri=logs_uri,
|
853
|
+
artifact_store=stack.artifact_store,
|
854
|
+
prepend_step_name=False,
|
855
|
+
) # type: ignore[assignment]
|
856
|
+
|
857
|
+
logs_model = LogsRequest(
|
858
|
+
uri=logs_uri,
|
859
|
+
artifact_store_id=stack.artifact_store.id,
|
860
|
+
)
|
861
|
+
|
862
|
+
with logs_context:
|
863
|
+
deployment = self._create_deployment(**self._run_args)
|
864
|
+
|
865
|
+
self.log_pipeline_deployment_metadata(deployment)
|
866
|
+
run = create_placeholder_run(
|
867
|
+
deployment=deployment, logs=logs_model
|
868
|
+
)
|
869
|
+
|
870
|
+
analytics_handler.metadata = (
|
871
|
+
self._get_pipeline_analytics_metadata(
|
872
|
+
deployment=deployment,
|
873
|
+
stack=stack,
|
874
|
+
run_id=run.id if run else None,
|
829
875
|
)
|
876
|
+
)
|
877
|
+
|
878
|
+
if run:
|
879
|
+
run_url = dashboard_utils.get_run_url(run)
|
880
|
+
if run_url:
|
881
|
+
logger.info(
|
882
|
+
f"Dashboard URL for Pipeline Run: {run_url}"
|
883
|
+
)
|
884
|
+
else:
|
885
|
+
logger.info(
|
886
|
+
"You can visualize your pipeline runs in the `ZenML "
|
887
|
+
"Dashboard`. In order to try it locally, please run "
|
888
|
+
"`zenml login --local`."
|
889
|
+
)
|
890
|
+
|
891
|
+
deploy_pipeline(
|
892
|
+
deployment=deployment, stack=stack, placeholder_run=run
|
893
|
+
)
|
830
894
|
|
831
|
-
deploy_pipeline(
|
832
|
-
deployment=deployment, stack=stack, placeholder_run=run
|
833
|
-
)
|
834
895
|
if run:
|
835
896
|
return Client().get_pipeline_run(run.id)
|
836
897
|
return None
|
zenml/pipelines/run_utils.py
CHANGED
@@ -15,6 +15,7 @@ from zenml.enums import ExecutionStatus
|
|
15
15
|
from zenml.logger import get_logger
|
16
16
|
from zenml.models import (
|
17
17
|
FlavorFilter,
|
18
|
+
LogsRequest,
|
18
19
|
PipelineDeploymentBase,
|
19
20
|
PipelineDeploymentResponse,
|
20
21
|
PipelineRunRequest,
|
@@ -49,6 +50,7 @@ def get_default_run_name(pipeline_name: str) -> str:
|
|
49
50
|
|
50
51
|
def create_placeholder_run(
|
51
52
|
deployment: "PipelineDeploymentResponse",
|
53
|
+
logs: Optional["LogsRequest"] = None,
|
52
54
|
) -> Optional["PipelineRunResponse"]:
|
53
55
|
"""Create a placeholder run for the deployment.
|
54
56
|
|
@@ -57,6 +59,7 @@ def create_placeholder_run(
|
|
57
59
|
|
58
60
|
Args:
|
59
61
|
deployment: The deployment for which to create the placeholder run.
|
62
|
+
logs: The logs for the run.
|
60
63
|
|
61
64
|
Returns:
|
62
65
|
The placeholder run or `None` if no run was created.
|
@@ -86,6 +89,7 @@ def create_placeholder_run(
|
|
86
89
|
pipeline=deployment.pipeline.id if deployment.pipeline else None,
|
87
90
|
status=ExecutionStatus.INITIALIZING,
|
88
91
|
tags=deployment.pipeline_configuration.tags,
|
92
|
+
logs=logs,
|
89
93
|
)
|
90
94
|
run, _ = Client().zen_store.get_or_create_run(run_request)
|
91
95
|
return run
|
zenml/steps/utils.py
CHANGED
@@ -553,7 +553,7 @@ def run_as_single_step_pipeline(
|
|
553
553
|
orchestrator = Client().active_stack.orchestrator
|
554
554
|
|
555
555
|
pipeline_settings: Any = {}
|
556
|
-
if "synchronous" in orchestrator.config.model_fields:
|
556
|
+
if "synchronous" in type(orchestrator.config).model_fields:
|
557
557
|
# Make sure the orchestrator runs sync so we stream the logs
|
558
558
|
key = settings_utils.get_stack_component_setting_key(orchestrator)
|
559
559
|
pipeline_settings[key] = BaseSettings(synchronous=True)
|
zenml/zen_server/auth.py
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
|
16
16
|
from contextvars import ContextVar
|
17
17
|
from datetime import datetime, timedelta
|
18
|
-
from typing import Callable, Optional, Union
|
18
|
+
from typing import Callable, Optional, Tuple, Union
|
19
19
|
from urllib.parse import urlencode, urlparse
|
20
20
|
from uuid import UUID, uuid4
|
21
21
|
|
@@ -33,9 +33,12 @@ from zenml.analytics.context import AnalyticsContext
|
|
33
33
|
from zenml.constants import (
|
34
34
|
API,
|
35
35
|
DEFAULT_USERNAME,
|
36
|
+
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME,
|
37
|
+
ENV_ZENML_WORKLOAD_TOKEN_EXPIRATION_LEEWAY,
|
36
38
|
EXTERNAL_AUTHENTICATOR_TIMEOUT,
|
37
39
|
LOGIN,
|
38
40
|
VERSION_1,
|
41
|
+
handle_int_env_var,
|
39
42
|
)
|
40
43
|
from zenml.enums import (
|
41
44
|
AuthScheme,
|
@@ -420,28 +423,32 @@ def authenticate_credentials(
|
|
420
423
|
@cache_result(expiry=30)
|
421
424
|
def get_pipeline_run_status(
|
422
425
|
pipeline_run_id: UUID,
|
423
|
-
) -> Optional[ExecutionStatus]:
|
426
|
+
) -> Tuple[Optional[ExecutionStatus], Optional[datetime]]:
|
424
427
|
"""Get the status of a pipeline run.
|
425
428
|
|
426
429
|
Args:
|
427
430
|
pipeline_run_id: The pipeline run ID.
|
428
431
|
|
429
432
|
Returns:
|
430
|
-
The pipeline run status or None if the pipeline
|
431
|
-
exist.
|
433
|
+
The pipeline run status and end time or None if the pipeline
|
434
|
+
run does not exist.
|
432
435
|
"""
|
433
436
|
try:
|
434
437
|
pipeline_run = zen_store().get_run(
|
435
|
-
pipeline_run_id, hydrate=
|
438
|
+
pipeline_run_id, hydrate=True
|
436
439
|
)
|
437
440
|
except KeyError:
|
438
|
-
return None
|
441
|
+
return None, None
|
439
442
|
|
440
|
-
return
|
443
|
+
return (
|
444
|
+
pipeline_run.status,
|
445
|
+
pipeline_run.end_time,
|
446
|
+
)
|
441
447
|
|
442
|
-
|
443
|
-
|
444
|
-
|
448
|
+
(
|
449
|
+
pipeline_run_status,
|
450
|
+
pipeline_run_end_time,
|
451
|
+
) = get_pipeline_run_status(decoded_token.pipeline_run_id)
|
445
452
|
if pipeline_run_status is None:
|
446
453
|
error = (
|
447
454
|
f"Authentication error: error retrieving token pipeline run "
|
@@ -450,59 +457,35 @@ def authenticate_credentials(
|
|
450
457
|
logger.error(error)
|
451
458
|
raise CredentialsNotValid(error)
|
452
459
|
|
460
|
+
leeway = handle_int_env_var(
|
461
|
+
ENV_ZENML_WORKLOAD_TOKEN_EXPIRATION_LEEWAY,
|
462
|
+
DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME,
|
463
|
+
)
|
453
464
|
if pipeline_run_status.is_finished:
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
step_run_id: The step run ID.
|
476
|
-
|
477
|
-
Returns:
|
478
|
-
The step run status or None if the step run does not exist.
|
479
|
-
"""
|
480
|
-
try:
|
481
|
-
step_run = zen_store().get_run_step(
|
482
|
-
step_run_id, hydrate=False
|
465
|
+
if leeway < 0:
|
466
|
+
# The token should never expire, we don't need to check
|
467
|
+
# the end time.
|
468
|
+
pass
|
469
|
+
elif (
|
470
|
+
# We don't know the end time. This should never happen, but
|
471
|
+
# just in case we always expire the token.
|
472
|
+
pipeline_run_end_time is None
|
473
|
+
# Calculate whether the token has expired.
|
474
|
+
or utc_now(tz_aware=pipeline_run_end_time)
|
475
|
+
> pipeline_run_end_time + timedelta(seconds=leeway)
|
476
|
+
):
|
477
|
+
error = (
|
478
|
+
f"The pipeline run {decoded_token.pipeline_run_id} has "
|
479
|
+
"finished and API tokens scoped to it are no longer "
|
480
|
+
"valid. If you want to increase the expiration time "
|
481
|
+
"of the token to allow steps to continue for longer "
|
482
|
+
"after other steps have failed, you can do so by "
|
483
|
+
"configuring the "
|
484
|
+
f"`{ENV_ZENML_WORKLOAD_TOKEN_EXPIRATION_LEEWAY}` "
|
485
|
+
"ZenML server environment variable."
|
483
486
|
)
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
return step_run.status
|
488
|
-
|
489
|
-
step_run_status = get_step_run_status(decoded_token.step_run_id)
|
490
|
-
if step_run_status is None:
|
491
|
-
error = (
|
492
|
-
f"Authentication error: error retrieving token step run "
|
493
|
-
f"{decoded_token.step_run_id}"
|
494
|
-
)
|
495
|
-
logger.error(error)
|
496
|
-
raise CredentialsNotValid(error)
|
497
|
-
|
498
|
-
if step_run_status.is_finished:
|
499
|
-
error = (
|
500
|
-
f"The execution of step run "
|
501
|
-
f"{decoded_token.step_run_id} has already concluded and "
|
502
|
-
"API tokens scoped to it are no longer valid."
|
503
|
-
)
|
504
|
-
logger.error(error)
|
505
|
-
raise CredentialsNotValid(error)
|
487
|
+
logger.error(error)
|
488
|
+
raise CredentialsNotValid(error)
|
506
489
|
|
507
490
|
auth_context = AuthContext(
|
508
491
|
user=user_model,
|
@@ -861,7 +844,6 @@ def generate_access_token(
|
|
861
844
|
expires_in: Optional[int] = None,
|
862
845
|
schedule_id: Optional[UUID] = None,
|
863
846
|
pipeline_run_id: Optional[UUID] = None,
|
864
|
-
step_run_id: Optional[UUID] = None,
|
865
847
|
) -> OAuthTokenResponse:
|
866
848
|
"""Generates an access token for the given user.
|
867
849
|
|
@@ -880,7 +862,6 @@ def generate_access_token(
|
|
880
862
|
expire.
|
881
863
|
schedule_id: The ID of the schedule to scope the token to.
|
882
864
|
pipeline_run_id: The ID of the pipeline run to scope the token to.
|
883
|
-
step_run_id: The ID of the step run to scope the token to.
|
884
865
|
|
885
866
|
Returns:
|
886
867
|
An authentication response with an access token.
|
@@ -956,7 +937,6 @@ def generate_access_token(
|
|
956
937
|
api_key_id=api_key.id if api_key else None,
|
957
938
|
schedule_id=schedule_id,
|
958
939
|
pipeline_run_id=pipeline_run_id,
|
959
|
-
step_run_id=step_run_id,
|
960
940
|
# Set the session ID if this is a cross-site request
|
961
941
|
session_id=session_id,
|
962
942
|
).encode(expires=expires)
|
@@ -1 +1 @@
|
|
1
|
-
import{j as e}from"./@radix-C7hRs6Kx.js";import{h as s,r as t}from"./index-
|
1
|
+
import{j as e}from"./@radix-C7hRs6Kx.js";import{h as s,r as t}from"./index-hsSXyS3H.js";import{E as r}from"./EmptyState-M1jafpg6.js";import{S as a}from"./help-DyMolRxD.js";import{L as o}from"./@react-router-BGgzhn5D.js";import"./@tanstack-CSxjHCME.js";import"./@reactflow-CQi1Z1Wq.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};
|
@@ -1 +1 @@
|
|
1
|
-
import{r as m,j as e}from"./@radix-C7hRs6Kx.js";import{t as g,v as p,ah as d,aT as h}from"./index-
|
1
|
+
import{r as m,j as e}from"./@radix-C7hRs6Kx.js";import{t as g,v as p,ah as d,aT as h}from"./index-hsSXyS3H.js";const x=m.forwardRef((r,t)=>{const{triggerChildren:a,children:i,onSelect:o,onOpenChange:l,icon:D,open:n,...s}=r;return e.jsxs(g,{open:n,onOpenChange:l,children:[e.jsx(p,{asChild:!0,children:e.jsx(d,{...s,className:"hover:cursor-pointer",icon:r.icon,ref:t,onSelect:c=>{c.preventDefault(),o&&o()},children:a})}),e.jsx(h,{children:i})]})});x.displayName="AlertDialogItem";export{x as A};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{aK as X,g as re,r as V,j as E}from"./@radix-C7hRs6Kx.js";import{m as Y,a7 as ie}from"./index-
|
1
|
+
import{aK as X,g as re,r as V,j as E}from"./@radix-C7hRs6Kx.js";import{m as Y,a7 as ie}from"./index-hsSXyS3H.js";var Z={exports:{}},J;function se(){return J||(J=1,function(A){var M=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/**
|
2
2
|
* Prism: Lightweight, robust, elegant syntax highlighting
|
3
3
|
*
|
4
4
|
* @license MIT <https://opensource.org/licenses/MIT>
|
zenml/zen_server/dashboard/assets/{CollapsibleCard-CQOb53t9.js → CollapsibleCard-9sSz7n1R.js}
RENAMED
@@ -1 +1 @@
|
|
1
|
-
import{r as p,j as e}from"./@radix-C7hRs6Kx.js";import{a8 as m,a9 as c,aa as d,ab as x,m as b}from"./index-
|
1
|
+
import{r as p,j as e}from"./@radix-C7hRs6Kx.js";import{a8 as m,a9 as c,aa as d,ab as x,m as b}from"./index-hsSXyS3H.js";import{S as f}from"./chevron-down-A-rmltmI.js";function g({title:r,children:s,initialOpen:o=!1,className:l,contentClassName:t,intent:n="primary"}){const[a,i]=p.useState(o);return e.jsxs(m,{className:l,open:a,onOpenChange:i,children:[e.jsx(c,{intent:n,children:e.jsxs(d,{className:"flex w-full items-center gap-[10px]",children:[e.jsx(f,{className:` ${a?"":"-rotate-90"} h-5 w-5 rounded-md fill-neutral-500 transition-transform duration-200 hover:bg-neutral-200`}),r]})}),e.jsx(x,{className:b("space-y-3 border-t border-theme-border-moderate bg-theme-surface-primary px-5 py-3",t),children:s})]})}export{g as C};
|
@@ -1 +1 @@
|
|
1
|
-
import{r as a,j as e}from"./@radix-C7hRs6Kx.js";import{ak as c,al as l,h as r,am as d,ao as n,ar as C,as as m}from"./index-
|
1
|
+
import{r as a,j as e}from"./@radix-C7hRs6Kx.js";import{ak as c,al as l,h as r,am as d,ao as n,ar as C,as as m}from"./index-hsSXyS3H.js";import{C as x}from"./CodeSnippet-nRnOvbOJ.js";const h=s=>a.createElement("svg",{viewBox:"0 0 24 24",fill:"black",xmlns:"http://www.w3.org/2000/svg",...s},a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3ZM1 12C1 5.92487 5.92487 1 12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12ZM11.2451 7.43304C11.2546 7.43912 11.264 7.44517 11.2734 7.45121L15.994 10.4859C16.0026 10.4914 16.0112 10.497 16.02 10.5026C16.171 10.5996 16.3361 10.7057 16.4676 10.8083C16.6071 10.917 16.8273 11.1089 16.9571 11.4162C17.1148 11.7894 17.1148 12.2106 16.9571 12.5838C16.8273 12.8911 16.6071 13.083 16.4676 13.1917C16.3361 13.2943 16.171 13.4004 16.02 13.4974C16.0112 13.503 16.0026 13.5086 15.994 13.5141L11.2734 16.5488C11.264 16.5548 11.2545 16.5609 11.2451 16.567C11.0694 16.68 10.8846 16.7988 10.7219 16.8835C10.5582 16.9687 10.2611 17.1066 9.89314 17.0804C9.45914 17.0494 9.05999 16.8314 8.79923 16.4831C8.57813 16.1878 8.5335 15.8633 8.51664 15.6796C8.49989 15.4969 8.49995 15.2772 8.49999 15.0683C8.5 15.057 8.5 15.0458 8.5 15.0347V8.96533C8.5 8.95417 8.5 8.94296 8.49999 8.93173C8.49995 8.72279 8.49989 8.50311 8.51664 8.32042C8.5335 8.13665 8.57813 7.81219 8.79923 7.51687C9.05999 7.16856 9.45914 6.95064 9.89314 6.91964C10.2611 6.89336 10.5582 7.03127 10.7219 7.11647C10.8846 7.20117 11.0694 7.32001 11.2451 7.43304ZM10.5 9.33167V14.6683L14.6507 12L10.5 9.33167Z"}));function g({videoLink:s,isButton:t=!0,buttonText:i,fallbackImage:o}){return e.jsxs(c,{children:[t?e.jsx(l,{asChild:!0,children:e.jsxs(r,{className:"mt-5 h-auto gap-1 px-2 py-1 sm:h-7",size:"md",children:[e.jsx(h,{className:"h-5 w-5 shrink-0 fill-white"}),i??e.jsx(e.Fragment,{children:"Watch the Quickstart Guide (3 min)"})]})}):e.jsx(l,{children:o}),e.jsxs(d,{className:"max-w-[1000px]",children:[e.jsx("div",{className:"flex items-center justify-between border-b border-theme-border-moderate py-2 pl-5 pr-3",children:e.jsx(n,{className:"text-text-lg",children:"Get Started"})}),e.jsx("div",{className:"",children:e.jsx("iframe",{className:"aspect-video w-full overflow-hidden",src:s,allowFullScreen:!0,allow:"fullscreen"})}),e.jsx(C,{children:e.jsx(m,{asChild:!0,children:e.jsx(r,{size:"md",children:"Close"})})})]})]})}function w(s){return e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-text-sm text-theme-text-secondary",children:s.description}),e.jsx(x,{codeClasses:"whitespace-pre-wrap",wrap:!0,code:s.command})]})}export{g as V,w as g};
|
@@ -1 +1 @@
|
|
1
|
-
import{j as e}from"./@radix-C7hRs6Kx.js";import{L as n}from"./index-
|
1
|
+
import{j as e}from"./@radix-C7hRs6Kx.js";import{L as n}from"./index-hsSXyS3H.js";import{C as o}from"./ComponentIcon-CSxdApv8.js";function m({type:s,children:r}){return e.jsxs(n,{rounded:!1,className:"inline-flex shrink items-center gap-0.5 overflow-x-hidden text-text-sm",color:"purple",emphasis:"minimal",children:[e.jsx(o,{type:s,className:"h-4 w-4 shrink-0 fill-current"}),e.jsx("div",{className:"truncate",children:r})]})}export{m as C};
|