zenml-nightly 0.68.1.dev20241106__py3-none-any.whl → 0.68.1.dev20241107__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/artifacts/utils.py +120 -58
- zenml/constants.py +1 -0
- zenml/integrations/evidently/__init__.py +1 -1
- zenml/integrations/vllm/services/vllm_deployment.py +16 -7
- zenml/orchestrators/step_runner.py +13 -10
- zenml/zen_server/rbac/endpoint_utils.py +43 -1
- zenml/zen_server/routers/artifact_version_endpoints.py +27 -1
- zenml/zen_stores/rest_zen_store.py +52 -0
- zenml/zen_stores/sql_zen_store.py +16 -0
- zenml/zen_stores/zen_store_interface.py +13 -0
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/METADATA +1 -1
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/RECORD +16 -16
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/entry_points.txt +0 -0
zenml/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.68.1.
|
1
|
+
0.68.1.dev20241107
|
zenml/artifacts/utils.py
CHANGED
@@ -82,6 +82,114 @@ logger = get_logger(__name__)
|
|
82
82
|
# ----------
|
83
83
|
|
84
84
|
|
85
|
+
def _save_artifact_visualizations(
|
86
|
+
data: Any, materializer: "BaseMaterializer"
|
87
|
+
) -> List[ArtifactVisualizationRequest]:
|
88
|
+
"""Save artifact visualizations.
|
89
|
+
|
90
|
+
Args:
|
91
|
+
data: The data for which to save the visualizations.
|
92
|
+
materializer: The materializer that should be used to generate and
|
93
|
+
save the visualizations.
|
94
|
+
|
95
|
+
Returns:
|
96
|
+
List of requests for the saved visualizations.
|
97
|
+
"""
|
98
|
+
try:
|
99
|
+
visualizations = materializer.save_visualizations(data)
|
100
|
+
except Exception as e:
|
101
|
+
logger.warning("Failed to save artifact visualizations: %s", e)
|
102
|
+
return []
|
103
|
+
|
104
|
+
return [
|
105
|
+
ArtifactVisualizationRequest(
|
106
|
+
type=type,
|
107
|
+
uri=uri,
|
108
|
+
)
|
109
|
+
for uri, type in visualizations.items()
|
110
|
+
]
|
111
|
+
|
112
|
+
|
113
|
+
def _store_artifact_data_and_prepare_request(
|
114
|
+
data: Any,
|
115
|
+
name: str,
|
116
|
+
uri: str,
|
117
|
+
materializer_class: Type["BaseMaterializer"],
|
118
|
+
version: Optional[Union[int, str]] = None,
|
119
|
+
tags: Optional[List[str]] = None,
|
120
|
+
store_metadata: bool = True,
|
121
|
+
store_visualizations: bool = True,
|
122
|
+
has_custom_name: bool = True,
|
123
|
+
metadata: Optional[Dict[str, "MetadataType"]] = None,
|
124
|
+
) -> ArtifactVersionRequest:
|
125
|
+
"""Store artifact data and prepare a request to the server.
|
126
|
+
|
127
|
+
Args:
|
128
|
+
data: The artifact data.
|
129
|
+
name: The artifact name.
|
130
|
+
uri: The artifact URI.
|
131
|
+
materializer_class: The materializer class to use for storing the
|
132
|
+
artifact data.
|
133
|
+
version: The artifact version.
|
134
|
+
tags: Tags for the artifact version.
|
135
|
+
store_metadata: Whether to store metadata for the artifact version.
|
136
|
+
store_visualizations: Whether to store visualizations for the artifact
|
137
|
+
version.
|
138
|
+
has_custom_name: Whether the artifact has a custom name.
|
139
|
+
metadata: Metadata to store for the artifact version. This will be
|
140
|
+
ignored if `store_metadata` is set to `False`.
|
141
|
+
|
142
|
+
Returns:
|
143
|
+
Artifact version request for the artifact data that was stored.
|
144
|
+
"""
|
145
|
+
artifact_store = Client().active_stack.artifact_store
|
146
|
+
artifact_store.makedirs(uri)
|
147
|
+
|
148
|
+
materializer = materializer_class(uri=uri, artifact_store=artifact_store)
|
149
|
+
materializer.uri = materializer.uri.replace("\\", "/")
|
150
|
+
|
151
|
+
data_type = type(data)
|
152
|
+
materializer.validate_save_type_compatibility(data_type)
|
153
|
+
materializer.save(data)
|
154
|
+
|
155
|
+
visualizations = (
|
156
|
+
_save_artifact_visualizations(data=data, materializer=materializer)
|
157
|
+
if store_visualizations
|
158
|
+
else None
|
159
|
+
)
|
160
|
+
|
161
|
+
combined_metadata: Dict[str, "MetadataType"] = {}
|
162
|
+
if store_metadata:
|
163
|
+
try:
|
164
|
+
combined_metadata = materializer.extract_full_metadata(data)
|
165
|
+
except Exception as e:
|
166
|
+
logger.warning("Failed to extract materializer metadata: %s", e)
|
167
|
+
|
168
|
+
# Update with user metadata to potentially overwrite values coming from
|
169
|
+
# the materializer
|
170
|
+
combined_metadata.update(metadata or {})
|
171
|
+
|
172
|
+
artifact_version_request = ArtifactVersionRequest(
|
173
|
+
artifact_name=name,
|
174
|
+
version=version,
|
175
|
+
tags=tags,
|
176
|
+
type=materializer.ASSOCIATED_ARTIFACT_TYPE,
|
177
|
+
uri=materializer.uri,
|
178
|
+
materializer=source_utils.resolve(materializer.__class__),
|
179
|
+
data_type=source_utils.resolve(data_type),
|
180
|
+
user=Client().active_user.id,
|
181
|
+
workspace=Client().active_workspace.id,
|
182
|
+
artifact_store_id=artifact_store.id,
|
183
|
+
visualizations=visualizations,
|
184
|
+
has_custom_name=has_custom_name,
|
185
|
+
metadata=validate_metadata(combined_metadata)
|
186
|
+
if combined_metadata
|
187
|
+
else None,
|
188
|
+
)
|
189
|
+
|
190
|
+
return artifact_version_request
|
191
|
+
|
192
|
+
|
85
193
|
def save_artifact(
|
86
194
|
data: Any,
|
87
195
|
name: str,
|
@@ -89,13 +197,14 @@ def save_artifact(
|
|
89
197
|
tags: Optional[List[str]] = None,
|
90
198
|
extract_metadata: bool = True,
|
91
199
|
include_visualizations: bool = True,
|
92
|
-
has_custom_name: bool = True,
|
93
200
|
user_metadata: Optional[Dict[str, "MetadataType"]] = None,
|
94
201
|
materializer: Optional["MaterializerClassOrSource"] = None,
|
95
202
|
uri: Optional[str] = None,
|
96
203
|
is_model_artifact: bool = False,
|
97
204
|
is_deployment_artifact: bool = False,
|
205
|
+
# TODO: remove these once external artifact does not use this function anymore
|
98
206
|
manual_save: bool = True,
|
207
|
+
has_custom_name: bool = True,
|
99
208
|
) -> "ArtifactVersionResponse":
|
100
209
|
"""Upload and publish an artifact.
|
101
210
|
|
@@ -107,8 +216,6 @@ def save_artifact(
|
|
107
216
|
tags: Tags to associate with the artifact.
|
108
217
|
extract_metadata: If artifact metadata should be extracted and returned.
|
109
218
|
include_visualizations: If artifact visualizations should be generated.
|
110
|
-
has_custom_name: If the artifact name is custom and should be listed in
|
111
|
-
the dashboard "Artifacts" tab.
|
112
219
|
user_metadata: User-provided metadata to store with the artifact.
|
113
220
|
materializer: The materializer to use for saving the artifact to the
|
114
221
|
artifact store.
|
@@ -119,6 +226,8 @@ def save_artifact(
|
|
119
226
|
is_deployment_artifact: If the artifact is a deployment artifact.
|
120
227
|
manual_save: If this function is called manually and should therefore
|
121
228
|
link the artifact to the current step run.
|
229
|
+
has_custom_name: If the artifact name is custom and should be listed in
|
230
|
+
the dashboard "Artifacts" tab.
|
122
231
|
|
123
232
|
Returns:
|
124
233
|
The saved artifact response.
|
@@ -129,11 +238,8 @@ def save_artifact(
|
|
129
238
|
from zenml.utils import source_utils
|
130
239
|
|
131
240
|
client = Client()
|
132
|
-
|
133
|
-
# Get the current artifact store
|
134
241
|
artifact_store = client.active_stack.artifact_store
|
135
242
|
|
136
|
-
# Build and check the artifact URI
|
137
243
|
if not uri:
|
138
244
|
uri = os.path.join("custom_artifacts", name, str(uuid4()))
|
139
245
|
if not uri.startswith(artifact_store.path):
|
@@ -147,9 +253,7 @@ def save_artifact(
|
|
147
253
|
uri=uri,
|
148
254
|
name=name,
|
149
255
|
)
|
150
|
-
artifact_store.makedirs(uri)
|
151
256
|
|
152
|
-
# Find and initialize the right materializer class
|
153
257
|
if isinstance(materializer, type):
|
154
258
|
materializer_class = materializer
|
155
259
|
elif materializer:
|
@@ -158,60 +262,18 @@ def save_artifact(
|
|
158
262
|
)
|
159
263
|
else:
|
160
264
|
materializer_class = materializer_registry[type(data)]
|
161
|
-
materializer_object = materializer_class(uri)
|
162
|
-
|
163
|
-
# Force URIs to have forward slashes
|
164
|
-
materializer_object.uri = materializer_object.uri.replace("\\", "/")
|
165
|
-
|
166
|
-
# Save the artifact to the artifact store
|
167
|
-
data_type = type(data)
|
168
|
-
materializer_object.validate_save_type_compatibility(data_type)
|
169
|
-
materializer_object.save(data)
|
170
265
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
for vis_uri, vis_type in vis_data.items():
|
177
|
-
vis_model = ArtifactVisualizationRequest(
|
178
|
-
type=vis_type,
|
179
|
-
uri=vis_uri,
|
180
|
-
)
|
181
|
-
visualizations.append(vis_model)
|
182
|
-
except Exception as e:
|
183
|
-
logger.warning(
|
184
|
-
f"Failed to save visualization for output artifact '{name}': "
|
185
|
-
f"{e}"
|
186
|
-
)
|
187
|
-
|
188
|
-
# Save metadata of the artifact
|
189
|
-
artifact_metadata: Dict[str, "MetadataType"] = {}
|
190
|
-
if extract_metadata:
|
191
|
-
try:
|
192
|
-
artifact_metadata = materializer_object.extract_full_metadata(data)
|
193
|
-
artifact_metadata.update(user_metadata or {})
|
194
|
-
except Exception as e:
|
195
|
-
logger.warning(
|
196
|
-
f"Failed to extract metadata for output artifact '{name}': {e}"
|
197
|
-
)
|
198
|
-
|
199
|
-
artifact_version_request = ArtifactVersionRequest(
|
200
|
-
artifact_name=name,
|
266
|
+
artifact_version_request = _store_artifact_data_and_prepare_request(
|
267
|
+
data=data,
|
268
|
+
name=name,
|
269
|
+
uri=uri,
|
270
|
+
materializer_class=materializer_class,
|
201
271
|
version=version,
|
202
272
|
tags=tags,
|
203
|
-
|
204
|
-
|
205
|
-
materializer=source_utils.resolve(materializer_object.__class__),
|
206
|
-
data_type=source_utils.resolve(data_type),
|
207
|
-
user=Client().active_user.id,
|
208
|
-
workspace=Client().active_workspace.id,
|
209
|
-
artifact_store_id=artifact_store.id,
|
210
|
-
visualizations=visualizations,
|
273
|
+
store_metadata=extract_metadata,
|
274
|
+
store_visualizations=include_visualizations,
|
211
275
|
has_custom_name=has_custom_name,
|
212
|
-
metadata=
|
213
|
-
if artifact_metadata
|
214
|
-
else None,
|
276
|
+
metadata=user_metadata,
|
215
277
|
)
|
216
278
|
artifact_version = client.zen_store.create_artifact_version(
|
217
279
|
artifact_version=artifact_version_request
|
zenml/constants.py
CHANGED
@@ -338,6 +338,7 @@ ARTIFACTS = "/artifacts"
|
|
338
338
|
ARTIFACT_VERSIONS = "/artifact_versions"
|
339
339
|
ARTIFACT_VISUALIZATIONS = "/artifact_visualizations"
|
340
340
|
AUTH = "/auth"
|
341
|
+
BATCH = "/batch"
|
341
342
|
CODE_REFERENCES = "/code_references"
|
342
343
|
CODE_REPOSITORIES = "/code_repositories"
|
343
344
|
COMPONENT_TYPES = "/component-types"
|
@@ -33,7 +33,7 @@ from zenml.stack import Flavor
|
|
33
33
|
|
34
34
|
# Fix numba errors in Docker and suppress logs and deprecation warning spam
|
35
35
|
try:
|
36
|
-
from numba.core.errors import (
|
36
|
+
from numba.core.errors import (
|
37
37
|
NumbaDeprecationWarning,
|
38
38
|
NumbaPendingDeprecationWarning,
|
39
39
|
)
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Implementation of the vLLM Inference Server Service."""
|
15
15
|
|
16
|
+
import argparse
|
16
17
|
import os
|
17
18
|
from typing import Any, List, Optional, Union
|
18
19
|
|
@@ -137,15 +138,23 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
|
|
137
138
|
self.endpoint.prepare_for_start()
|
138
139
|
|
139
140
|
import uvloop
|
140
|
-
from vllm.entrypoints.openai.api_server import
|
141
|
-
|
142
|
-
|
141
|
+
from vllm.entrypoints.openai.api_server import (
|
142
|
+
run_server,
|
143
|
+
)
|
144
|
+
from vllm.entrypoints.openai.cli_args import (
|
145
|
+
make_arg_parser,
|
146
|
+
)
|
147
|
+
from vllm.utils import (
|
148
|
+
FlexibleArgumentParser,
|
149
|
+
)
|
143
150
|
|
144
151
|
try:
|
145
|
-
parser = make_arg_parser(
|
146
|
-
|
152
|
+
parser: argparse.ArgumentParser = make_arg_parser(
|
153
|
+
FlexibleArgumentParser()
|
154
|
+
)
|
155
|
+
args: argparse.Namespace = parser.parse_args()
|
147
156
|
# Override port with the available port
|
148
|
-
self.config.port = self.endpoint.status.port
|
157
|
+
self.config.port = self.endpoint.status.port or self.config.port
|
149
158
|
# Update the arguments in place
|
150
159
|
args.__dict__.update(self.config.model_dump())
|
151
160
|
uvloop.run(run_server(args=args))
|
@@ -161,7 +170,7 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
|
|
161
170
|
"""
|
162
171
|
if not self.is_running:
|
163
172
|
return None
|
164
|
-
return self.endpoint.
|
173
|
+
return self.endpoint.prediction_url
|
165
174
|
|
166
175
|
def predict(self, data: "Any") -> "Any":
|
167
176
|
"""Make a prediction using the service.
|
@@ -28,7 +28,8 @@ from typing import (
|
|
28
28
|
)
|
29
29
|
|
30
30
|
from zenml.artifacts.unmaterialized_artifact import UnmaterializedArtifact
|
31
|
-
from zenml.artifacts.utils import
|
31
|
+
from zenml.artifacts.utils import _store_artifact_data_and_prepare_request
|
32
|
+
from zenml.client import Client
|
32
33
|
from zenml.config.step_configurations import StepConfiguration
|
33
34
|
from zenml.config.step_run_info import StepRunInfo
|
34
35
|
from zenml.constants import (
|
@@ -534,7 +535,7 @@ class StepRunner:
|
|
534
535
|
The IDs of the published output artifacts.
|
535
536
|
"""
|
536
537
|
step_context = get_step_context()
|
537
|
-
|
538
|
+
artifact_requests = []
|
538
539
|
|
539
540
|
for output_name, return_value in output_data.items():
|
540
541
|
data_type = type(return_value)
|
@@ -595,22 +596,24 @@ class StepRunner:
|
|
595
596
|
# Get full set of tags
|
596
597
|
tags = step_context.get_output_tags(output_name)
|
597
598
|
|
598
|
-
|
599
|
+
artifact_request = _store_artifact_data_and_prepare_request(
|
599
600
|
name=artifact_name,
|
600
601
|
data=return_value,
|
601
|
-
|
602
|
+
materializer_class=materializer_class,
|
602
603
|
uri=uri,
|
603
|
-
|
604
|
-
|
604
|
+
store_metadata=artifact_metadata_enabled,
|
605
|
+
store_visualizations=artifact_visualization_enabled,
|
605
606
|
has_custom_name=has_custom_name,
|
606
607
|
version=version,
|
607
608
|
tags=tags,
|
608
|
-
|
609
|
-
manual_save=False,
|
609
|
+
metadata=user_metadata,
|
610
610
|
)
|
611
|
-
|
611
|
+
artifact_requests.append(artifact_request)
|
612
612
|
|
613
|
-
|
613
|
+
responses = Client().zen_store.batch_create_artifact_versions(
|
614
|
+
artifact_requests
|
615
|
+
)
|
616
|
+
return dict(zip(output_data.keys(), responses))
|
614
617
|
|
615
618
|
def load_and_run_hook(
|
616
619
|
self,
|
@@ -13,7 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""High-level helper functions to write endpoints with RBAC."""
|
15
15
|
|
16
|
-
from typing import Any, Callable, TypeVar, Union
|
16
|
+
from typing import Any, Callable, List, TypeVar, Union
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
19
|
from pydantic import BaseModel
|
@@ -96,6 +96,48 @@ def verify_permissions_and_create_entity(
|
|
96
96
|
return created
|
97
97
|
|
98
98
|
|
99
|
+
def verify_permissions_and_batch_create_entity(
|
100
|
+
batch: List[AnyRequest],
|
101
|
+
resource_type: ResourceType,
|
102
|
+
create_method: Callable[[List[AnyRequest]], List[AnyResponse]],
|
103
|
+
) -> List[AnyResponse]:
|
104
|
+
"""Verify permissions and create a batch of entities if authorized.
|
105
|
+
|
106
|
+
Args:
|
107
|
+
batch: The batch to create.
|
108
|
+
resource_type: The resource type of the entities to create.
|
109
|
+
create_method: The method to create the entities.
|
110
|
+
|
111
|
+
Raises:
|
112
|
+
IllegalOperationError: If the request model has a different owner then
|
113
|
+
the currently authenticated user.
|
114
|
+
RuntimeError: If the resource type is usage-tracked.
|
115
|
+
|
116
|
+
Returns:
|
117
|
+
The created entities.
|
118
|
+
"""
|
119
|
+
auth_context = get_auth_context()
|
120
|
+
assert auth_context
|
121
|
+
|
122
|
+
for request_model in batch:
|
123
|
+
if isinstance(request_model, UserScopedRequest):
|
124
|
+
if request_model.user != auth_context.user.id:
|
125
|
+
raise IllegalOperationError(
|
126
|
+
f"Not allowed to create resource '{resource_type}' for a "
|
127
|
+
"different user."
|
128
|
+
)
|
129
|
+
|
130
|
+
verify_permission(resource_type=resource_type, action=Action.CREATE)
|
131
|
+
|
132
|
+
if resource_type in REPORTABLE_RESOURCES:
|
133
|
+
raise RuntimeError(
|
134
|
+
"Batch requests are currently not possible with usage-tracked features."
|
135
|
+
)
|
136
|
+
|
137
|
+
created = create_method(batch)
|
138
|
+
return created
|
139
|
+
|
140
|
+
|
99
141
|
def verify_permissions_and_get_entity(
|
100
142
|
id: UUIDOrStr,
|
101
143
|
get_method: Callable[[UUIDOrStr], AnyResponse],
|
@@ -13,12 +13,13 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Endpoint definitions for artifact versions."""
|
15
15
|
|
16
|
+
from typing import List
|
16
17
|
from uuid import UUID
|
17
18
|
|
18
19
|
from fastapi import APIRouter, Depends, Security
|
19
20
|
|
20
21
|
from zenml.artifacts.utils import load_artifact_visualization
|
21
|
-
from zenml.constants import API, ARTIFACT_VERSIONS, VERSION_1, VISUALIZE
|
22
|
+
from zenml.constants import API, ARTIFACT_VERSIONS, BATCH, VERSION_1, VISUALIZE
|
22
23
|
from zenml.models import (
|
23
24
|
ArtifactVersionFilter,
|
24
25
|
ArtifactVersionRequest,
|
@@ -30,6 +31,7 @@ from zenml.models import (
|
|
30
31
|
from zenml.zen_server.auth import AuthContext, authorize
|
31
32
|
from zenml.zen_server.exceptions import error_response
|
32
33
|
from zenml.zen_server.rbac.endpoint_utils import (
|
34
|
+
verify_permissions_and_batch_create_entity,
|
33
35
|
verify_permissions_and_create_entity,
|
34
36
|
verify_permissions_and_delete_entity,
|
35
37
|
verify_permissions_and_get_entity,
|
@@ -118,6 +120,30 @@ def create_artifact_version(
|
|
118
120
|
)
|
119
121
|
|
120
122
|
|
123
|
+
@artifact_version_router.post(
|
124
|
+
BATCH,
|
125
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
126
|
+
)
|
127
|
+
@handle_exceptions
|
128
|
+
def batch_create_artifact_version(
|
129
|
+
artifact_versions: List[ArtifactVersionRequest],
|
130
|
+
_: AuthContext = Security(authorize),
|
131
|
+
) -> List[ArtifactVersionResponse]:
|
132
|
+
"""Create a batch of artifact versions.
|
133
|
+
|
134
|
+
Args:
|
135
|
+
artifact_versions: The artifact versions to create.
|
136
|
+
|
137
|
+
Returns:
|
138
|
+
The created artifact versions.
|
139
|
+
"""
|
140
|
+
return verify_permissions_and_batch_create_entity(
|
141
|
+
batch=artifact_versions,
|
142
|
+
resource_type=ResourceType.ARTIFACT_VERSION,
|
143
|
+
create_method=zen_store().batch_create_artifact_versions,
|
144
|
+
)
|
145
|
+
|
146
|
+
|
121
147
|
@artifact_version_router.get(
|
122
148
|
"/{artifact_version_id}",
|
123
149
|
response_model=ArtifactVersionResponse,
|
@@ -57,6 +57,7 @@ from zenml.constants import (
|
|
57
57
|
ARTIFACT_VERSIONS,
|
58
58
|
ARTIFACT_VISUALIZATIONS,
|
59
59
|
ARTIFACTS,
|
60
|
+
BATCH,
|
60
61
|
CODE_REFERENCES,
|
61
62
|
CODE_REPOSITORIES,
|
62
63
|
CONFIG,
|
@@ -991,6 +992,23 @@ class RestZenStore(BaseZenStore):
|
|
991
992
|
route=ARTIFACT_VERSIONS,
|
992
993
|
)
|
993
994
|
|
995
|
+
def batch_create_artifact_versions(
|
996
|
+
self, artifact_versions: List[ArtifactVersionRequest]
|
997
|
+
) -> List[ArtifactVersionResponse]:
|
998
|
+
"""Creates a batch of artifact versions.
|
999
|
+
|
1000
|
+
Args:
|
1001
|
+
artifact_versions: The artifact versions to create.
|
1002
|
+
|
1003
|
+
Returns:
|
1004
|
+
The created artifact versions.
|
1005
|
+
"""
|
1006
|
+
return self._batch_create_resources(
|
1007
|
+
resources=artifact_versions,
|
1008
|
+
response_model=ArtifactVersionResponse,
|
1009
|
+
route=ARTIFACT_VERSIONS,
|
1010
|
+
)
|
1011
|
+
|
994
1012
|
def get_artifact_version(
|
995
1013
|
self, artifact_version_id: UUID, hydrate: bool = True
|
996
1014
|
) -> ArtifactVersionResponse:
|
@@ -4518,6 +4536,40 @@ class RestZenStore(BaseZenStore):
|
|
4518
4536
|
|
4519
4537
|
return response_model.model_validate(response_body)
|
4520
4538
|
|
4539
|
+
def _batch_create_resources(
|
4540
|
+
self,
|
4541
|
+
resources: List[AnyRequest],
|
4542
|
+
response_model: Type[AnyResponse],
|
4543
|
+
route: str,
|
4544
|
+
params: Optional[Dict[str, Any]] = None,
|
4545
|
+
) -> List[AnyResponse]:
|
4546
|
+
"""Create a new batch of resources.
|
4547
|
+
|
4548
|
+
Args:
|
4549
|
+
resources: The resources to create.
|
4550
|
+
response_model: The response model of an individual resource.
|
4551
|
+
route: The resource REST route to use.
|
4552
|
+
params: Optional query parameters to pass to the endpoint.
|
4553
|
+
|
4554
|
+
Returns:
|
4555
|
+
List of response models.
|
4556
|
+
"""
|
4557
|
+
json_data = [
|
4558
|
+
resource.model_dump(mode="json") for resource in resources
|
4559
|
+
]
|
4560
|
+
response = self._request(
|
4561
|
+
"POST",
|
4562
|
+
self.url + API + VERSION_1 + route + BATCH,
|
4563
|
+
json=json_data,
|
4564
|
+
params=params,
|
4565
|
+
)
|
4566
|
+
assert isinstance(response, list)
|
4567
|
+
|
4568
|
+
return [
|
4569
|
+
response_model.model_validate(model_data)
|
4570
|
+
for model_data in response
|
4571
|
+
]
|
4572
|
+
|
4521
4573
|
def _create_workspace_scoped_resource(
|
4522
4574
|
self,
|
4523
4575
|
resource: AnyWorkspaceScopedRequest,
|
@@ -2915,6 +2915,22 @@ class SqlZenStore(BaseZenStore):
|
|
2915
2915
|
include_metadata=True, include_resources=True
|
2916
2916
|
)
|
2917
2917
|
|
2918
|
+
def batch_create_artifact_versions(
|
2919
|
+
self, artifact_versions: List[ArtifactVersionRequest]
|
2920
|
+
) -> List[ArtifactVersionResponse]:
|
2921
|
+
"""Creates a batch of artifact versions.
|
2922
|
+
|
2923
|
+
Args:
|
2924
|
+
artifact_versions: The artifact versions to create.
|
2925
|
+
|
2926
|
+
Returns:
|
2927
|
+
The created artifact versions.
|
2928
|
+
"""
|
2929
|
+
return [
|
2930
|
+
self.create_artifact_version(artifact_version)
|
2931
|
+
for artifact_version in artifact_versions
|
2932
|
+
]
|
2933
|
+
|
2918
2934
|
def get_artifact_version(
|
2919
2935
|
self, artifact_version_id: UUID, hydrate: bool = True
|
2920
2936
|
) -> ArtifactVersionResponse:
|
@@ -663,6 +663,19 @@ class ZenStoreInterface(ABC):
|
|
663
663
|
The created artifact version.
|
664
664
|
"""
|
665
665
|
|
666
|
+
@abstractmethod
|
667
|
+
def batch_create_artifact_versions(
|
668
|
+
self, artifact_versions: List[ArtifactVersionRequest]
|
669
|
+
) -> List[ArtifactVersionResponse]:
|
670
|
+
"""Creates a batch of artifact versions.
|
671
|
+
|
672
|
+
Args:
|
673
|
+
artifact_versions: The artifact versions to create.
|
674
|
+
|
675
|
+
Returns:
|
676
|
+
The created artifact versions.
|
677
|
+
"""
|
678
|
+
|
666
679
|
@abstractmethod
|
667
680
|
def get_artifact_version(
|
668
681
|
self, artifact_version_id: UUID, hydrate: bool = True
|
{zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/RECORD
RENAMED
@@ -6,7 +6,7 @@ RELEASE_NOTES.md,sha256=oShLQurhMKncKnc_y7tiasEfgy1aCOOjxdpax-MlGI8,381641
|
|
6
6
|
ROADMAP.md,sha256=hiLSmr16BH8Dfx7SaQM4JcXCGCVl6mFZPFAwJeDTrJU,407
|
7
7
|
SECURITY.md,sha256=9DepA8y03yvCZLHEfcXLTDH4lUyKHquAdukBsccNN7c,682
|
8
8
|
zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
|
9
|
-
zenml/VERSION,sha256=
|
9
|
+
zenml/VERSION,sha256=QDKeVhbF6fs029-SW9Q5z3reEeQtoNgK6UdydkwWesA,19
|
10
10
|
zenml/__init__.py,sha256=XhLh9kV87ErcivCctQJaTtUOjl6kugT3pVyqqLKzBP8,2058
|
11
11
|
zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
|
12
12
|
zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
|
@@ -32,7 +32,7 @@ zenml/artifacts/external_artifact.py,sha256=2zmU9XQHwDefuODlBjKAdin91IWwZTJ8pVbg
|
|
32
32
|
zenml/artifacts/external_artifact_config.py,sha256=P172p0JOu8Xx1F8RCQut1dnRpt5lpWXGNqMbY-V90sI,3323
|
33
33
|
zenml/artifacts/preexisting_data_materializer.py,sha256=dcahDcHUD3Lvn0-6zE2BG84bkyo_ydAgzBWxtbyJJZQ,3325
|
34
34
|
zenml/artifacts/unmaterialized_artifact.py,sha256=JNPKq_sNifQx5wP8jEw7TGBEi26zwKirPGlWX9uxbJI,1300
|
35
|
-
zenml/artifacts/utils.py,sha256=
|
35
|
+
zenml/artifacts/utils.py,sha256=mEbWT2V7yQ64jMc_cKLddkVx-JZK8DLQn8ggwKINicU,35058
|
36
36
|
zenml/cli/__init__.py,sha256=o72CwXCP9TxQpS-FH9RZuDfA2FifFpIsISESNORh6aI,74915
|
37
37
|
zenml/cli/annotator.py,sha256=tEdducGdFn57DFLJVZQ-MyXH1auTGFueRmDc78N-vPQ,6970
|
38
38
|
zenml/cli/artifact.py,sha256=7lsAS52DroBTFkFWxkyb-lIDOGP5jPL_Se_RDG_2jgg,9564
|
@@ -92,7 +92,7 @@ zenml/config/step_run_info.py,sha256=KiVRSTtKmZ1GbvseDTap2imr7XwMHD3jSFVpyLNEK1I
|
|
92
92
|
zenml/config/store_config.py,sha256=Cla5p5dTB6nNlo8_OZDs9hod5hspi64vxwtZj882XgU,3559
|
93
93
|
zenml/config/strict_base_model.py,sha256=iHnO9qOmLUP_eiy9IjRr3JjIs1l1I_CsRQ76EyAneYU,860
|
94
94
|
zenml/console.py,sha256=hj_KerPQKwnyKACj0ehSqUQX0mGVCJBKE1QvCt6ik3A,1160
|
95
|
-
zenml/constants.py,sha256=
|
95
|
+
zenml/constants.py,sha256=Zxy9gG0oDayzv7ULgng5ikgY1ojLLvNCl4R8R2T7yfQ,15642
|
96
96
|
zenml/container_registries/__init__.py,sha256=ZSPbBIOnzhg88kQSpYgKe_POLuru14m629665-kAVAA,2200
|
97
97
|
zenml/container_registries/azure_container_registry.py,sha256=t1sfDa94Vzbyqtb1iPFNutJ2EXV5_p9CUNITasoiQ70,2667
|
98
98
|
zenml/container_registries/base_container_registry.py,sha256=6c2e32wuqxYHJXm5OV2LY1MtX9yopB7WZtes9fmTAz0,7625
|
@@ -234,7 +234,7 @@ zenml/integrations/discord/flavors/discord_alerter_flavor.py,sha256=9hX7R7dfxSwi
|
|
234
234
|
zenml/integrations/discord/steps/__init__.py,sha256=stSDntUMzrHzwMJm1V1-jm7otII7uW6Fxj7qYB7MWrc,663
|
235
235
|
zenml/integrations/discord/steps/discord_alerter_ask_step.py,sha256=puBERGjhpBRaift8GCygAgnjgZHbeqclRywxJjjjEG8,2553
|
236
236
|
zenml/integrations/discord/steps/discord_alerter_post_step.py,sha256=te4M4Q47e1nShPHLLv414bjDuG_r7XCxDUbLgwGXEtI,2283
|
237
|
-
zenml/integrations/evidently/__init__.py,sha256=
|
237
|
+
zenml/integrations/evidently/__init__.py,sha256=ISgJ8GB5QMLm3L55-Ipo7adrJqltJpobU-mUTOtNzUM,3069
|
238
238
|
zenml/integrations/evidently/column_mapping.py,sha256=slZwGaArhYZNZnXfwYFXZEt7bqq2jswvb1vwkedvGRE,3555
|
239
239
|
zenml/integrations/evidently/data_validators/__init__.py,sha256=7H1HCXAefk-asnSAYqfud-l17rsBFfhCrgps2abhmFY,830
|
240
240
|
zenml/integrations/evidently/data_validators/evidently_data_validator.py,sha256=V34Nze3Mi4JpTlJJQf-i582WxAZrg5-yAv1HcUf7ULE,10316
|
@@ -543,7 +543,7 @@ zenml/integrations/vllm/flavors/vllm_model_deployer_flavor.py,sha256=_3P0-qyjdsV
|
|
543
543
|
zenml/integrations/vllm/model_deployers/__init__.py,sha256=Z38oWIfkArNsxCm3rQkTdYK4dbtx2BpTUw1gw_kl6Do,803
|
544
544
|
zenml/integrations/vllm/model_deployers/vllm_model_deployer.py,sha256=OYPNSkB-I5r4eQ_7kr4F7GDwNj6efcsio8WRteQ5cYI,9665
|
545
545
|
zenml/integrations/vllm/services/__init__.py,sha256=Id28GEfHECI0RnGAGGNioD9eZ6aJxdNebe112VgC59g,788
|
546
|
-
zenml/integrations/vllm/services/vllm_deployment.py,sha256=
|
546
|
+
zenml/integrations/vllm/services/vllm_deployment.py,sha256=mp42O5_DaTIoJzerPMVuukEPT3XQkrzVQcSJdEto-wI,6800
|
547
547
|
zenml/integrations/wandb/__init__.py,sha256=LBlnX4chpaB3atIsxkF0RSz2AJs9gHQWRptkgkqF6lw,1711
|
548
548
|
zenml/integrations/wandb/experiment_trackers/__init__.py,sha256=8nFyyvh-PTF5d9ZfjS7xFSWTWSpreRB1azePv-Ex2sc,771
|
549
549
|
zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py,sha256=xNkF-3-WwpC8OV38T5evV35t6rH5o3O6uBlX4cimsKs,5092
|
@@ -681,7 +681,7 @@ zenml/orchestrators/output_utils.py,sha256=Gz7SX2cbQ3w4eyfU0XuhKEKGtalQGBoc6moDR
|
|
681
681
|
zenml/orchestrators/publish_utils.py,sha256=aNwgTDmVSq9qCDP3Ldk77YNXnWx_YHjYNTEJwYeZo9s,4579
|
682
682
|
zenml/orchestrators/step_launcher.py,sha256=SHmATi2qlGYLJzGdGvuTeurYfl1-OosJlEkeVcJRiIY,17741
|
683
683
|
zenml/orchestrators/step_run_utils.py,sha256=y_O8_Vt943-vzj1dHajx7mHc4ih1xCm6ptgR-SdivaE,20333
|
684
|
-
zenml/orchestrators/step_runner.py,sha256=
|
684
|
+
zenml/orchestrators/step_runner.py,sha256=EEHCbCNRBHddumAswqSknNbp-zYvF0RsQMU_egaxWEA,24766
|
685
685
|
zenml/orchestrators/topsort.py,sha256=D8evz3X47zwpXd90NMLsJD-_uCeXtV6ClzNfDUrq7cM,5784
|
686
686
|
zenml/orchestrators/utils.py,sha256=U52BKVhsvSyClwmNRtH2hHQIGd0u9us7SAAcDjKn9BI,10260
|
687
687
|
zenml/orchestrators/wheeled_orchestrator.py,sha256=eOnMcnd3sCzfhA2l6qRAzF0rOXzaojbjvvYvTkqixQo,4791
|
@@ -992,7 +992,7 @@ zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py,sha256=X6sQGR70SHHFxQe
|
|
992
992
|
zenml/zen_server/jwt.py,sha256=plUREdNvezUvTWaMTbewBfgJ5pOAQ5IGSr-BWsLMzVg,6124
|
993
993
|
zenml/zen_server/rate_limit.py,sha256=rOg5H_6rOGQ_qiSCtMKPREmL1LL3bZyn4czKILtImJg,6057
|
994
994
|
zenml/zen_server/rbac/__init__.py,sha256=nACbn_G7nZt_AWM3zeFL0FCmELvQnvaOFMwvTG3-6ZE,637
|
995
|
-
zenml/zen_server/rbac/endpoint_utils.py,sha256=
|
995
|
+
zenml/zen_server/rbac/endpoint_utils.py,sha256=Q2QqnoDky_UF8DB0cs4SC6U75lZLNmGPs3-pUo1-y6w,7903
|
996
996
|
zenml/zen_server/rbac/models.py,sha256=U3I-nw6yWhbuqK0IHJkgct6G3B4XQJZSC96ghj1a27Y,2404
|
997
997
|
zenml/zen_server/rbac/rbac_interface.py,sha256=pNdfNtis5YhQgpWYkli7xNwfzNT_uXQlBaYKlSFi5HA,2881
|
998
998
|
zenml/zen_server/rbac/utils.py,sha256=bgHBwIJ-fl1FL2hJBP8lBuA4Xb7keu30HyDIl0mh12M,19942
|
@@ -1000,7 +1000,7 @@ zenml/zen_server/rbac/zenml_cloud_rbac.py,sha256=mFWwskAEmeZyNCVF4aImEZpZNqm4SWA
|
|
1000
1000
|
zenml/zen_server/routers/__init__.py,sha256=ViyAhWL-ogHxE9wBvB_iMcur5H1NRVrzXkpogVY7FBA,641
|
1001
1001
|
zenml/zen_server/routers/actions_endpoints.py,sha256=TgFFU9fMu43iqTu-ybnxJ5QokzV-eivRAd6pW2TrFe0,9549
|
1002
1002
|
zenml/zen_server/routers/artifact_endpoint.py,sha256=XhbOat2pddDluiT0a_QH2RfNcqlwtf3yf2Fh92a6ZDw,5175
|
1003
|
-
zenml/zen_server/routers/artifact_version_endpoints.py,sha256=
|
1003
|
+
zenml/zen_server/routers/artifact_version_endpoints.py,sha256=TZpBPhNI6njJLKI-QX8wbNIn9-fFFGXKWqaVdiXFZVw,8528
|
1004
1004
|
zenml/zen_server/routers/auth_endpoints.py,sha256=ZcLnz1P_jW4F9ttntpZxd_lRK9wXf2pL9WJZFU-8BNU,20334
|
1005
1005
|
zenml/zen_server/routers/code_repositories_endpoints.py,sha256=WFCRPsv3Qrm8QtCr5zxfSdgCS5WI1DPNCF4Y6vLXGow,4747
|
1006
1006
|
zenml/zen_server/routers/devices_endpoints.py,sha256=luqj7owGuQ-2LyAC6Pka7GjEVpYpfi_QDdFKXhWlXek,10712
|
@@ -1207,7 +1207,7 @@ zenml/zen_stores/migrations/versions/ec0d785ca296_create_run_metadata_table.py,s
|
|
1207
1207
|
zenml/zen_stores/migrations/versions/f3b3964e3a0f_add_oauth_devices.py,sha256=2CR4R-7Vx6j_AXxo-e5Guy6OX-ZnS47HSKSGfqlO-y0,3065
|
1208
1208
|
zenml/zen_stores/migrations/versions/f49904a80aa7_increase_length_of_artifact_table_sources.py,sha256=kLgfDUnQdAb5_SyFx3VKXDLC0YbuBKf9iXRDNeBin7Q,1618
|
1209
1209
|
zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py,sha256=kn-ng5EHe_mmLfffIFbz7T59z-to3oMx8III_4wOsz4,1956
|
1210
|
-
zenml/zen_stores/rest_zen_store.py,sha256=
|
1210
|
+
zenml/zen_stores/rest_zen_store.py,sha256=x_Cusp-aeUiMfjL0W6fSaOIsR_XyiNRRV3Ff1xMSUWk,157791
|
1211
1211
|
zenml/zen_stores/schemas/__init__.py,sha256=D0T3cSqZ1wIewUI181WD76iY2pLyKX4HWCbx6JjXR7I,4266
|
1212
1212
|
zenml/zen_stores/schemas/action_schemas.py,sha256=vNnDF4zRy0eWgNwtcU7yY0JXyqe4I3Nns2LHRHWwiDs,6293
|
1213
1213
|
zenml/zen_stores/schemas/api_key_schemas.py,sha256=pCvoTSXSHz-im6aRt-opSBnmIhw3wDRIsi-NJP5WtCQ,7243
|
@@ -1250,11 +1250,11 @@ zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py,sha256=NfW1EHIA99lseb
|
|
1250
1250
|
zenml/zen_stores/secrets_stores/secrets_store_interface.py,sha256=Q2Jbnt2Pp7NGlR-u1YBfRZV2g8su2Fd0ArBMdksAE-Q,2819
|
1251
1251
|
zenml/zen_stores/secrets_stores/service_connector_secrets_store.py,sha256=kPYX-Z_OOhZCI1CP77ncfV7IsV4e8brklnTXmKxZYNc,7078
|
1252
1252
|
zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=Bq1djrUP9saoD7vECjS7-TlA_7sjJGgw1talri4spjU,8656
|
1253
|
-
zenml/zen_stores/sql_zen_store.py,sha256=
|
1253
|
+
zenml/zen_stores/sql_zen_store.py,sha256=CM3ClHBWDpZVWba-dsK-vZL1mRIOAoxrFZyuHFlnIGU,403273
|
1254
1254
|
zenml/zen_stores/template_utils.py,sha256=EKYBgmDLTS_PSMWaIO5yvHPLiQvMqHcsAe6NUCrv-i4,9068
|
1255
|
-
zenml/zen_stores/zen_store_interface.py,sha256=
|
1256
|
-
zenml_nightly-0.68.1.
|
1257
|
-
zenml_nightly-0.68.1.
|
1258
|
-
zenml_nightly-0.68.1.
|
1259
|
-
zenml_nightly-0.68.1.
|
1260
|
-
zenml_nightly-0.68.1.
|
1255
|
+
zenml/zen_stores/zen_store_interface.py,sha256=ULNbbpimQ6I1COd2o_B-t4PRwo-pb6MKsk1W8ht8Cjg,93874
|
1256
|
+
zenml_nightly-0.68.1.dev20241107.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
|
1257
|
+
zenml_nightly-0.68.1.dev20241107.dist-info/METADATA,sha256=EFLdsT_HLfZhJGwPNu83C-PetvN1onLYyZEi-5vk7Qc,21208
|
1258
|
+
zenml_nightly-0.68.1.dev20241107.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
1259
|
+
zenml_nightly-0.68.1.dev20241107.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
|
1260
|
+
zenml_nightly-0.68.1.dev20241107.dist-info/RECORD,,
|
{zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/LICENSE
RENAMED
File without changes
|
{zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241107.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|