digitalhub 0.7.0b2__py3-none-any.whl → 0.8.0__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.

Potentially problematic release.


This version of digitalhub might be problematic. Click here for more details.

Files changed (232) hide show
  1. digitalhub/__init__.py +63 -93
  2. digitalhub/client/__init__.py +0 -0
  3. digitalhub/client/_base/__init__.py +0 -0
  4. digitalhub/client/_base/client.py +56 -0
  5. digitalhub/client/api.py +63 -0
  6. digitalhub/client/builder.py +50 -0
  7. digitalhub/client/dhcore/__init__.py +0 -0
  8. digitalhub/client/dhcore/client.py +669 -0
  9. digitalhub/client/dhcore/env.py +21 -0
  10. digitalhub/client/dhcore/models.py +46 -0
  11. digitalhub/client/dhcore/utils.py +111 -0
  12. digitalhub/client/local/__init__.py +0 -0
  13. digitalhub/client/local/client.py +533 -0
  14. digitalhub/context/__init__.py +0 -0
  15. digitalhub/context/api.py +93 -0
  16. digitalhub/context/builder.py +94 -0
  17. digitalhub/context/context.py +136 -0
  18. digitalhub/datastores/__init__.py +0 -0
  19. digitalhub/datastores/_base/__init__.py +0 -0
  20. digitalhub/datastores/_base/datastore.py +85 -0
  21. digitalhub/datastores/api.py +37 -0
  22. digitalhub/datastores/builder.py +110 -0
  23. digitalhub/datastores/local/__init__.py +0 -0
  24. digitalhub/datastores/local/datastore.py +50 -0
  25. digitalhub/datastores/remote/__init__.py +0 -0
  26. digitalhub/datastores/remote/datastore.py +31 -0
  27. digitalhub/datastores/s3/__init__.py +0 -0
  28. digitalhub/datastores/s3/datastore.py +46 -0
  29. digitalhub/datastores/sql/__init__.py +0 -0
  30. digitalhub/datastores/sql/datastore.py +68 -0
  31. digitalhub/entities/__init__.py +0 -0
  32. digitalhub/entities/_base/__init__.py +0 -0
  33. digitalhub/entities/_base/_base/__init__.py +0 -0
  34. digitalhub/entities/_base/_base/entity.py +82 -0
  35. digitalhub/entities/_base/api_utils.py +620 -0
  36. digitalhub/entities/_base/context/__init__.py +0 -0
  37. digitalhub/entities/_base/context/entity.py +118 -0
  38. digitalhub/entities/_base/crud.py +468 -0
  39. digitalhub/entities/_base/entity/__init__.py +0 -0
  40. digitalhub/entities/_base/entity/_constructors/__init__.py +0 -0
  41. digitalhub/entities/_base/entity/_constructors/metadata.py +44 -0
  42. digitalhub/entities/_base/entity/_constructors/name.py +31 -0
  43. digitalhub/entities/_base/entity/_constructors/spec.py +33 -0
  44. digitalhub/entities/_base/entity/_constructors/status.py +52 -0
  45. digitalhub/entities/_base/entity/_constructors/uuid.py +26 -0
  46. digitalhub/entities/_base/entity/builder.py +175 -0
  47. digitalhub/entities/_base/entity/entity.py +106 -0
  48. digitalhub/entities/_base/entity/metadata.py +59 -0
  49. digitalhub/entities/_base/entity/spec.py +58 -0
  50. digitalhub/entities/_base/entity/status.py +43 -0
  51. digitalhub/entities/_base/executable/__init__.py +0 -0
  52. digitalhub/entities/_base/executable/entity.py +405 -0
  53. digitalhub/entities/_base/material/__init__.py +0 -0
  54. digitalhub/entities/_base/material/entity.py +214 -0
  55. digitalhub/entities/_base/material/spec.py +22 -0
  56. digitalhub/entities/_base/material/status.py +49 -0
  57. digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
  58. digitalhub/entities/_base/runtime_entity/builder.py +106 -0
  59. digitalhub/entities/_base/unversioned/__init__.py +0 -0
  60. digitalhub/entities/_base/unversioned/builder.py +66 -0
  61. digitalhub/entities/_base/unversioned/entity.py +49 -0
  62. digitalhub/entities/_base/versioned/__init__.py +0 -0
  63. digitalhub/entities/_base/versioned/builder.py +68 -0
  64. digitalhub/entities/_base/versioned/entity.py +53 -0
  65. digitalhub/entities/artifact/__init__.py +0 -0
  66. digitalhub/entities/artifact/_base/__init__.py +0 -0
  67. digitalhub/entities/artifact/_base/builder.py +86 -0
  68. digitalhub/entities/artifact/_base/entity.py +39 -0
  69. digitalhub/entities/artifact/_base/spec.py +15 -0
  70. digitalhub/entities/artifact/_base/status.py +9 -0
  71. digitalhub/entities/artifact/artifact/__init__.py +0 -0
  72. digitalhub/entities/artifact/artifact/builder.py +18 -0
  73. digitalhub/entities/artifact/artifact/entity.py +32 -0
  74. digitalhub/entities/artifact/artifact/spec.py +27 -0
  75. digitalhub/entities/artifact/artifact/status.py +15 -0
  76. digitalhub/entities/artifact/crud.py +332 -0
  77. digitalhub/entities/builders.py +63 -0
  78. digitalhub/entities/dataitem/__init__.py +0 -0
  79. digitalhub/entities/dataitem/_base/__init__.py +0 -0
  80. digitalhub/entities/dataitem/_base/builder.py +86 -0
  81. digitalhub/entities/dataitem/_base/entity.py +75 -0
  82. digitalhub/entities/dataitem/_base/spec.py +15 -0
  83. digitalhub/entities/dataitem/_base/status.py +20 -0
  84. digitalhub/entities/dataitem/crud.py +372 -0
  85. digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
  86. digitalhub/entities/dataitem/dataitem/builder.py +18 -0
  87. digitalhub/entities/dataitem/dataitem/entity.py +32 -0
  88. digitalhub/entities/dataitem/dataitem/spec.py +15 -0
  89. digitalhub/entities/dataitem/dataitem/status.py +9 -0
  90. digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
  91. digitalhub/entities/dataitem/iceberg/builder.py +18 -0
  92. digitalhub/entities/dataitem/iceberg/entity.py +32 -0
  93. digitalhub/entities/dataitem/iceberg/spec.py +15 -0
  94. digitalhub/entities/dataitem/iceberg/status.py +9 -0
  95. digitalhub/entities/dataitem/table/__init__.py +0 -0
  96. digitalhub/entities/dataitem/table/builder.py +18 -0
  97. digitalhub/entities/dataitem/table/entity.py +146 -0
  98. digitalhub/entities/dataitem/table/models.py +62 -0
  99. digitalhub/entities/dataitem/table/spec.py +25 -0
  100. digitalhub/entities/dataitem/table/status.py +9 -0
  101. digitalhub/entities/function/__init__.py +0 -0
  102. digitalhub/entities/function/_base/__init__.py +0 -0
  103. digitalhub/entities/function/_base/builder.py +79 -0
  104. digitalhub/entities/function/_base/entity.py +98 -0
  105. digitalhub/entities/function/_base/models.py +118 -0
  106. digitalhub/entities/function/_base/spec.py +15 -0
  107. digitalhub/entities/function/_base/status.py +9 -0
  108. digitalhub/entities/function/crud.py +279 -0
  109. digitalhub/entities/model/__init__.py +0 -0
  110. digitalhub/entities/model/_base/__init__.py +0 -0
  111. digitalhub/entities/model/_base/builder.py +86 -0
  112. digitalhub/entities/model/_base/entity.py +34 -0
  113. digitalhub/entities/model/_base/spec.py +49 -0
  114. digitalhub/entities/model/_base/status.py +9 -0
  115. digitalhub/entities/model/crud.py +331 -0
  116. digitalhub/entities/model/huggingface/__init__.py +0 -0
  117. digitalhub/entities/model/huggingface/builder.py +18 -0
  118. digitalhub/entities/model/huggingface/entity.py +32 -0
  119. digitalhub/entities/model/huggingface/spec.py +36 -0
  120. digitalhub/entities/model/huggingface/status.py +9 -0
  121. digitalhub/entities/model/mlflow/__init__.py +0 -0
  122. digitalhub/entities/model/mlflow/builder.py +18 -0
  123. digitalhub/entities/model/mlflow/entity.py +32 -0
  124. digitalhub/entities/model/mlflow/models.py +26 -0
  125. digitalhub/entities/model/mlflow/spec.py +44 -0
  126. digitalhub/entities/model/mlflow/status.py +9 -0
  127. digitalhub/entities/model/mlflow/utils.py +81 -0
  128. digitalhub/entities/model/model/__init__.py +0 -0
  129. digitalhub/entities/model/model/builder.py +18 -0
  130. digitalhub/entities/model/model/entity.py +32 -0
  131. digitalhub/entities/model/model/spec.py +15 -0
  132. digitalhub/entities/model/model/status.py +9 -0
  133. digitalhub/entities/model/sklearn/__init__.py +0 -0
  134. digitalhub/entities/model/sklearn/builder.py +18 -0
  135. digitalhub/entities/model/sklearn/entity.py +32 -0
  136. digitalhub/entities/model/sklearn/spec.py +15 -0
  137. digitalhub/entities/model/sklearn/status.py +9 -0
  138. digitalhub/entities/project/__init__.py +0 -0
  139. digitalhub/entities/project/_base/__init__.py +0 -0
  140. digitalhub/entities/project/_base/builder.py +128 -0
  141. digitalhub/entities/project/_base/entity.py +2078 -0
  142. digitalhub/entities/project/_base/spec.py +50 -0
  143. digitalhub/entities/project/_base/status.py +9 -0
  144. digitalhub/entities/project/crud.py +357 -0
  145. digitalhub/entities/run/__init__.py +0 -0
  146. digitalhub/entities/run/_base/__init__.py +0 -0
  147. digitalhub/entities/run/_base/builder.py +94 -0
  148. digitalhub/entities/run/_base/entity.py +307 -0
  149. digitalhub/entities/run/_base/spec.py +50 -0
  150. digitalhub/entities/run/_base/status.py +9 -0
  151. digitalhub/entities/run/crud.py +219 -0
  152. digitalhub/entities/secret/__init__.py +0 -0
  153. digitalhub/entities/secret/_base/__init__.py +0 -0
  154. digitalhub/entities/secret/_base/builder.py +81 -0
  155. digitalhub/entities/secret/_base/entity.py +74 -0
  156. digitalhub/entities/secret/_base/spec.py +35 -0
  157. digitalhub/entities/secret/_base/status.py +9 -0
  158. digitalhub/entities/secret/crud.py +290 -0
  159. digitalhub/entities/task/__init__.py +0 -0
  160. digitalhub/entities/task/_base/__init__.py +0 -0
  161. digitalhub/entities/task/_base/builder.py +91 -0
  162. digitalhub/entities/task/_base/entity.py +136 -0
  163. digitalhub/entities/task/_base/models.py +208 -0
  164. digitalhub/entities/task/_base/spec.py +53 -0
  165. digitalhub/entities/task/_base/status.py +9 -0
  166. digitalhub/entities/task/crud.py +228 -0
  167. digitalhub/entities/utils/__init__.py +0 -0
  168. digitalhub/entities/utils/api.py +346 -0
  169. digitalhub/entities/utils/entity_types.py +19 -0
  170. digitalhub/entities/utils/state.py +31 -0
  171. digitalhub/entities/utils/utils.py +202 -0
  172. digitalhub/entities/workflow/__init__.py +0 -0
  173. digitalhub/entities/workflow/_base/__init__.py +0 -0
  174. digitalhub/entities/workflow/_base/builder.py +79 -0
  175. digitalhub/entities/workflow/_base/entity.py +74 -0
  176. digitalhub/entities/workflow/_base/spec.py +15 -0
  177. digitalhub/entities/workflow/_base/status.py +9 -0
  178. digitalhub/entities/workflow/crud.py +278 -0
  179. digitalhub/factory/__init__.py +0 -0
  180. digitalhub/factory/api.py +277 -0
  181. digitalhub/factory/factory.py +268 -0
  182. digitalhub/factory/utils.py +90 -0
  183. digitalhub/readers/__init__.py +0 -0
  184. digitalhub/readers/_base/__init__.py +0 -0
  185. digitalhub/readers/_base/builder.py +26 -0
  186. digitalhub/readers/_base/reader.py +70 -0
  187. digitalhub/readers/api.py +80 -0
  188. digitalhub/readers/factory.py +133 -0
  189. digitalhub/readers/pandas/__init__.py +0 -0
  190. digitalhub/readers/pandas/builder.py +29 -0
  191. digitalhub/readers/pandas/reader.py +207 -0
  192. digitalhub/runtimes/__init__.py +0 -0
  193. digitalhub/runtimes/_base.py +102 -0
  194. digitalhub/runtimes/builder.py +32 -0
  195. digitalhub/stores/__init__.py +0 -0
  196. digitalhub/stores/_base/__init__.py +0 -0
  197. digitalhub/stores/_base/store.py +189 -0
  198. digitalhub/stores/api.py +54 -0
  199. digitalhub/stores/builder.py +211 -0
  200. digitalhub/stores/local/__init__.py +0 -0
  201. digitalhub/stores/local/store.py +230 -0
  202. digitalhub/stores/remote/__init__.py +0 -0
  203. digitalhub/stores/remote/store.py +143 -0
  204. digitalhub/stores/s3/__init__.py +0 -0
  205. digitalhub/stores/s3/store.py +563 -0
  206. digitalhub/stores/sql/__init__.py +0 -0
  207. digitalhub/stores/sql/store.py +328 -0
  208. digitalhub/utils/__init__.py +0 -0
  209. digitalhub/utils/data_utils.py +127 -0
  210. digitalhub/utils/exceptions.py +67 -0
  211. digitalhub/utils/file_utils.py +204 -0
  212. digitalhub/utils/generic_utils.py +183 -0
  213. digitalhub/utils/git_utils.py +148 -0
  214. digitalhub/utils/io_utils.py +116 -0
  215. digitalhub/utils/logger.py +17 -0
  216. digitalhub/utils/s3_utils.py +58 -0
  217. digitalhub/utils/uri_utils.py +56 -0
  218. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/METADATA +30 -13
  219. digitalhub-0.8.0.dist-info/RECORD +231 -0
  220. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/WHEEL +1 -1
  221. test/local/CRUD/test_artifacts.py +96 -0
  222. test/local/CRUD/test_dataitems.py +96 -0
  223. test/local/CRUD/test_models.py +95 -0
  224. test/test_crud_functions.py +1 -1
  225. test/test_crud_runs.py +1 -1
  226. test/test_crud_tasks.py +1 -1
  227. digitalhub-0.7.0b2.dist-info/RECORD +0 -14
  228. test/test_crud_artifacts.py +0 -96
  229. test/test_crud_dataitems.py +0 -96
  230. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/LICENSE.txt +0 -0
  231. {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/top_level.txt +0 -0
  232. /test/{test_imports.py → local/imports/test_imports.py} +0 -0
@@ -0,0 +1,86 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.versioned.builder import VersionedBuilder
6
+ from digitalhub.entities.utils.entity_types import EntityTypes
7
+ from digitalhub.utils.exceptions import EntityError
8
+
9
+ if typing.TYPE_CHECKING:
10
+ from digitalhub.entities.model._base.entity import Model
11
+
12
+
13
+ class ModelBuilder(VersionedBuilder):
14
+ """
15
+ Model builder.
16
+ """
17
+
18
+ ENTITY_TYPE = EntityTypes.MODEL.value
19
+
20
+ def build(
21
+ self,
22
+ kind: str,
23
+ project: str,
24
+ name: str,
25
+ uuid: str | None = None,
26
+ description: str | None = None,
27
+ labels: list[str] | None = None,
28
+ embedded: bool = False,
29
+ path: str | None = None,
30
+ **kwargs,
31
+ ) -> Model:
32
+ """
33
+ Create a new object.
34
+
35
+ Parameters
36
+ ----------
37
+ project : str
38
+ Project name.
39
+ name : str
40
+ Object name.
41
+ kind : str
42
+ Kind the object.
43
+ uuid : str
44
+ ID of the object.
45
+ description : str
46
+ Description of the object (human readable).
47
+ labels : list[str]
48
+ List of labels.
49
+ embedded : bool
50
+ Flag to determine if object spec must be embedded in project spec.
51
+ path : str
52
+ Object path on local file system or remote storage. It is also the destination path of upload() method.
53
+ **kwargs : dict
54
+ Spec keyword arguments.
55
+
56
+ Returns
57
+ -------
58
+ Model
59
+ Object instance.
60
+ """
61
+ if path is None:
62
+ raise EntityError("Path must be provided.")
63
+
64
+ name = self.build_name(name)
65
+ uuid = self.build_uuid(uuid)
66
+ metadata = self.build_metadata(
67
+ project=project,
68
+ name=name,
69
+ description=description,
70
+ labels=labels,
71
+ embedded=embedded,
72
+ )
73
+ spec = self.build_spec(
74
+ path=path,
75
+ **kwargs,
76
+ )
77
+ status = self.build_status()
78
+ return self.build_entity(
79
+ project=project,
80
+ name=name,
81
+ uuid=uuid,
82
+ kind=kind,
83
+ metadata=metadata,
84
+ spec=spec,
85
+ status=status,
86
+ )
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.material.entity import MaterialEntity
6
+ from digitalhub.entities.utils.entity_types import EntityTypes
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from digitalhub.entities._base.entity.metadata import Metadata
10
+ from digitalhub.entities.model._base.spec import ModelSpec
11
+ from digitalhub.entities.model._base.status import ModelStatus
12
+
13
+
14
+ class Model(MaterialEntity):
15
+ """
16
+ A class representing a model.
17
+ """
18
+
19
+ ENTITY_TYPE = EntityTypes.MODEL.value
20
+
21
+ def __init__(
22
+ self,
23
+ project: str,
24
+ name: str,
25
+ uuid: str,
26
+ kind: str,
27
+ metadata: Metadata,
28
+ spec: ModelSpec,
29
+ status: ModelStatus,
30
+ user: str | None = None,
31
+ ) -> None:
32
+ super().__init__(project, name, uuid, kind, metadata, spec, status, user)
33
+ self.spec: ModelSpec
34
+ self.status: ModelStatus
@@ -0,0 +1,49 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.material.spec import MaterialSpec, MaterialValidator
4
+
5
+
6
+ class ModelSpec(MaterialSpec):
7
+ """
8
+ ModelSpec specifications.
9
+ """
10
+
11
+ def __init__(
12
+ self,
13
+ path: str,
14
+ framework: str | None = None,
15
+ algorithm: str | None = None,
16
+ base_model: str | None = None,
17
+ parameters: dict | None = None,
18
+ metrics: dict | None = None,
19
+ ) -> None:
20
+ self.path = path
21
+ self.framework = framework
22
+ self.algorithm = algorithm
23
+ self.base_model = base_model
24
+ self.parameters = parameters
25
+ self.metrics = metrics
26
+
27
+
28
+ class ModelValidator(MaterialValidator):
29
+ """
30
+ ModelValidator validator.
31
+ """
32
+
33
+ path: str
34
+ """Path to the model."""
35
+
36
+ framework: str = None
37
+ """Model framework (e.g. 'pytorch')."""
38
+
39
+ algorithm: str = None
40
+ """Model algorithm (e.g. 'resnet')."""
41
+
42
+ base_model: str = None
43
+ """Base model."""
44
+
45
+ parameters: dict = None
46
+ """Model validator."""
47
+
48
+ metrics: dict = None
49
+ """Model metrics."""
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities._base.material.status import MaterialStatus
4
+
5
+
6
+ class ModelStatus(MaterialStatus):
7
+ """
8
+ ModelStatus status.
9
+ """
@@ -0,0 +1,331 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities._base.crud import (
6
+ delete_entity,
7
+ get_material_entity,
8
+ get_material_entity_versions,
9
+ import_context_entity,
10
+ list_material_entities,
11
+ new_context_entity,
12
+ )
13
+ from digitalhub.entities._base.entity._constructors.uuid import build_uuid
14
+ from digitalhub.entities.utils.entity_types import EntityTypes
15
+ from digitalhub.entities.utils.utils import build_log_path_from_source, eval_local_source
16
+
17
+ if typing.TYPE_CHECKING:
18
+ from digitalhub.entities.model._base.entity import Model
19
+
20
+
21
+ ENTITY_TYPE = EntityTypes.MODEL.value
22
+
23
+
24
+ def new_model(
25
+ project: str,
26
+ name: str,
27
+ kind: str,
28
+ uuid: str | None = None,
29
+ description: str | None = None,
30
+ labels: list[str] | None = None,
31
+ embedded: bool = False,
32
+ path: str | None = None,
33
+ **kwargs,
34
+ ) -> Model:
35
+ """
36
+ Create a new object.
37
+
38
+ Parameters
39
+ ----------
40
+ project : str
41
+ Project name.
42
+ name : str
43
+ Object name.
44
+ kind : str
45
+ Kind the object.
46
+ uuid : str
47
+ ID of the object.
48
+ description : str
49
+ Description of the object (human readable).
50
+ labels : list[str]
51
+ List of labels.
52
+ embedded : bool
53
+ Flag to determine if object spec must be embedded in project spec.
54
+ path : str
55
+ Object path on local file system or remote storage. It is also the destination path of upload() method.
56
+ **kwargs : dict
57
+ Spec keyword arguments.
58
+
59
+ Returns
60
+ -------
61
+ Model
62
+ Object instance.
63
+
64
+ Examples
65
+ --------
66
+ >>> obj = new_model(project="my-project",
67
+ >>> name="my-model",
68
+ >>> kind="model",
69
+ >>> path="s3://my-bucket/my-key")
70
+ """
71
+ return new_context_entity(
72
+ project=project,
73
+ name=name,
74
+ kind=kind,
75
+ uuid=uuid,
76
+ description=description,
77
+ labels=labels,
78
+ embedded=embedded,
79
+ path=path,
80
+ **kwargs,
81
+ )
82
+
83
+
84
+ def log_model(
85
+ project: str,
86
+ name: str,
87
+ kind: str,
88
+ source: list[str] | str,
89
+ path: str | None = None,
90
+ **kwargs,
91
+ ) -> Model:
92
+ """
93
+ Create and upload an object.
94
+
95
+ Parameters
96
+ ----------
97
+ project : str
98
+ Project name.
99
+ name : str
100
+ Object name.
101
+ kind : str
102
+ Kind the object.
103
+ source : str
104
+ Model location on local path.
105
+ path : str
106
+ Destination path of the model. If not provided, it's generated.
107
+ **kwargs : dict
108
+ New model spec parameters.
109
+
110
+ Returns
111
+ -------
112
+ Model
113
+ Object instance.
114
+
115
+ Examples
116
+ --------
117
+ >>> obj = log_model(project="my-project",
118
+ >>> name="my-model",
119
+ >>> kind="model",
120
+ >>> source="./local-path")
121
+ """
122
+ eval_local_source(source)
123
+
124
+ if path is None:
125
+ uuid = build_uuid()
126
+ kwargs["uuid"] = uuid
127
+ path = build_log_path_from_source(project, ENTITY_TYPE, name, uuid, source)
128
+
129
+ obj = new_model(project=project, name=name, kind=kind, path=path, **kwargs)
130
+ obj.upload(source)
131
+ return obj
132
+
133
+
134
+ def get_model(
135
+ identifier: str,
136
+ project: str | None = None,
137
+ entity_id: str | None = None,
138
+ **kwargs,
139
+ ) -> Model:
140
+ """
141
+ Get object from backend.
142
+
143
+ Parameters
144
+ ----------
145
+ identifier : str
146
+ Entity key (store://...) or entity name.
147
+ project : str
148
+ Project name.
149
+ entity_id : str
150
+ Entity ID.
151
+ **kwargs : dict
152
+ Parameters to pass to the API call.
153
+
154
+ Returns
155
+ -------
156
+ Model
157
+ Object instance.
158
+
159
+ Examples
160
+ --------
161
+ Using entity key:
162
+ >>> obj = get_model("store://my-model-key")
163
+
164
+ Using entity name:
165
+ >>> obj = get_model("my-model-name"
166
+ >>> project="my-project",
167
+ >>> entity_id="my-model-id")
168
+ """
169
+ return get_material_entity(
170
+ identifier=identifier,
171
+ entity_type=ENTITY_TYPE,
172
+ project=project,
173
+ entity_id=entity_id,
174
+ **kwargs,
175
+ )
176
+
177
+
178
+ def get_model_versions(
179
+ identifier: str,
180
+ project: str | None = None,
181
+ **kwargs,
182
+ ) -> list[Model]:
183
+ """
184
+ Get object versions from backend.
185
+
186
+ Parameters
187
+ ----------
188
+ identifier : str
189
+ Entity key (store://...) or entity name.
190
+ project : str
191
+ Project name.
192
+ **kwargs : dict
193
+ Parameters to pass to the API call.
194
+
195
+ Returns
196
+ -------
197
+ list[Model]
198
+ List of object instances.
199
+
200
+ Examples
201
+ --------
202
+ Using entity key:
203
+ >>> objs = get_model_versions("store://my-model-key")
204
+
205
+ Using entity name:
206
+ >>> objs = get_model_versions("my-model-name",
207
+ >>> project="my-project")
208
+ """
209
+ return get_material_entity_versions(
210
+ identifier=identifier,
211
+ entity_type=ENTITY_TYPE,
212
+ project=project,
213
+ **kwargs,
214
+ )
215
+
216
+
217
+ def list_models(project: str, **kwargs) -> list[Model]:
218
+ """
219
+ List all latest version objects from backend.
220
+
221
+ Parameters
222
+ ----------
223
+ project : str
224
+ Project name.
225
+ **kwargs : dict
226
+ Parameters to pass to the API call.
227
+
228
+ Returns
229
+ -------
230
+ list[Model]
231
+ List of object instances.
232
+
233
+ Examples
234
+ --------
235
+ >>> objs = list_models(project="my-project")
236
+ """
237
+ return list_material_entities(
238
+ project=project,
239
+ entity_type=ENTITY_TYPE,
240
+ **kwargs,
241
+ )
242
+
243
+
244
+ def import_model(file: str) -> Model:
245
+ """
246
+ Import object from a YAML file.
247
+
248
+ Parameters
249
+ ----------
250
+ file : str
251
+ Path to YAML file.
252
+
253
+ Returns
254
+ -------
255
+ Model
256
+ Object instance.
257
+
258
+ Examples
259
+ --------
260
+ >>> obj = import_model("my-model.yaml")
261
+ """
262
+ return import_context_entity(file)
263
+
264
+
265
+ def update_model(entity: Model) -> Model:
266
+ """
267
+ Update object. Note that object spec are immutable.
268
+
269
+ Parameters
270
+ ----------
271
+ entity : Model
272
+ Object to update.
273
+
274
+ Returns
275
+ -------
276
+ Model
277
+ Entity updated.
278
+
279
+ Examples
280
+ --------
281
+ >>> obj = get_model("store://my-model-key")
282
+ """
283
+ return entity.save(update=True)
284
+
285
+
286
+ def delete_model(
287
+ identifier: str,
288
+ project: str | None = None,
289
+ entity_id: str | None = None,
290
+ delete_all_versions: bool = False,
291
+ **kwargs,
292
+ ) -> dict:
293
+ """
294
+ Delete object from backend.
295
+
296
+ Parameters
297
+ ----------
298
+ identifier : str
299
+ Entity key (store://...) or entity name.
300
+ project : str
301
+ Project name.
302
+ entity_id : str
303
+ Entity ID.
304
+ delete_all_versions : bool
305
+ Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
306
+ **kwargs : dict
307
+ Parameters to pass to the API call.
308
+
309
+ Returns
310
+ -------
311
+ dict
312
+ Response from backend.
313
+
314
+ Examples
315
+ --------
316
+ If delete_all_versions is False:
317
+ >>> obj = delete_model("store://my-model-key")
318
+
319
+ Otherwise:
320
+ >>> obj = delete_model("my-model-name",
321
+ >>> project="my-project",
322
+ >>> delete_all_versions=True)
323
+ """
324
+ return delete_entity(
325
+ identifier=identifier,
326
+ entity_type=ENTITY_TYPE,
327
+ project=project,
328
+ entity_id=entity_id,
329
+ delete_all_versions=delete_all_versions,
330
+ **kwargs,
331
+ )
File without changes
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.model._base.builder import ModelBuilder
4
+ from digitalhub.entities.model.huggingface.entity import ModelHuggingface
5
+ from digitalhub.entities.model.huggingface.spec import ModelSpecHuggingface, ModelValidatorHuggingface
6
+ from digitalhub.entities.model.huggingface.status import ModelStatusHuggingface
7
+
8
+
9
+ class ModelHuggingfaceBuilder(ModelBuilder):
10
+ """
11
+ ModelHuggingface builder.
12
+ """
13
+
14
+ ENTITY_CLASS = ModelHuggingface
15
+ ENTITY_SPEC_CLASS = ModelSpecHuggingface
16
+ ENTITY_SPEC_VALIDATOR = ModelValidatorHuggingface
17
+ ENTITY_STATUS_CLASS = ModelStatusHuggingface
18
+ ENTITY_KIND = "huggingface"
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities.model._base.entity import Model
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.entities._base.entity.metadata import Metadata
9
+ from digitalhub.entities.model.huggingface.spec import ModelSpecHuggingface
10
+ from digitalhub.entities.model.huggingface.status import ModelStatusHuggingface
11
+
12
+
13
+ class ModelHuggingface(Model):
14
+ """
15
+ ModelHuggingface class.
16
+ """
17
+
18
+ def __init__(
19
+ self,
20
+ project: str,
21
+ name: str,
22
+ uuid: str,
23
+ kind: str,
24
+ metadata: Metadata,
25
+ spec: ModelSpecHuggingface,
26
+ status: ModelStatusHuggingface,
27
+ user: str | None = None,
28
+ ) -> None:
29
+ super().__init__(project, name, uuid, kind, metadata, spec, status, user)
30
+
31
+ self.spec: ModelSpecHuggingface
32
+ self.status: ModelStatusHuggingface
@@ -0,0 +1,36 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.model._base.spec import ModelSpec, ModelValidator
4
+
5
+
6
+ class ModelSpecHuggingface(ModelSpec):
7
+ """
8
+ ModelSpecHuggingface specifications.
9
+ """
10
+
11
+ def __init__(
12
+ self,
13
+ path: str,
14
+ framework: str | None = None,
15
+ algorithm: str | None = None,
16
+ base_model: str | None = None,
17
+ parameters: dict | None = None,
18
+ metrics: dict | None = None,
19
+ model_id: str | None = None,
20
+ model_revision: str = None,
21
+ ) -> None:
22
+ super().__init__(path, framework, algorithm, base_model, parameters, metrics)
23
+ self.model_id = model_id
24
+ self.model_revision = model_revision
25
+
26
+
27
+ class ModelValidatorHuggingface(ModelValidator):
28
+ """
29
+ ModelValidatorHuggingface validator.
30
+ """
31
+
32
+ model_id: str = None
33
+ """Huggingface model id. If not specified, the model is loaded from the model path."""
34
+
35
+ model_revision: str = None
36
+ """Huggingface model revision."""
@@ -0,0 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.model._base.status import ModelStatus
4
+
5
+
6
+ class ModelStatusHuggingface(ModelStatus):
7
+ """
8
+ ModelStatusHuggingface status.
9
+ """
File without changes
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.entities.model._base.builder import ModelBuilder
4
+ from digitalhub.entities.model.mlflow.entity import ModelMlflow
5
+ from digitalhub.entities.model.mlflow.spec import ModelSpecMlflow, ModelValidatorMlflow
6
+ from digitalhub.entities.model.mlflow.status import ModelStatusMlflow
7
+
8
+
9
+ class ModelModelBuilder(ModelBuilder):
10
+ """
11
+ ModelMlflow builder.
12
+ """
13
+
14
+ ENTITY_CLASS = ModelMlflow
15
+ ENTITY_SPEC_CLASS = ModelSpecMlflow
16
+ ENTITY_SPEC_VALIDATOR = ModelValidatorMlflow
17
+ ENTITY_STATUS_CLASS = ModelStatusMlflow
18
+ ENTITY_KIND = "mlflow"
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.entities.model._base.entity import Model
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.entities._base.entity.metadata import Metadata
9
+ from digitalhub.entities.model.mlflow.spec import ModelSpecMlflow
10
+ from digitalhub.entities.model.mlflow.status import ModelStatusMlflow
11
+
12
+
13
+ class ModelMlflow(Model):
14
+ """
15
+ ModelMlflow class.
16
+ """
17
+
18
+ def __init__(
19
+ self,
20
+ project: str,
21
+ name: str,
22
+ uuid: str,
23
+ kind: str,
24
+ metadata: Metadata,
25
+ spec: ModelSpecMlflow,
26
+ status: ModelStatusMlflow,
27
+ user: str | None = None,
28
+ ) -> None:
29
+ super().__init__(project, name, uuid, kind, metadata, spec, status, user)
30
+
31
+ self.spec: ModelSpecMlflow
32
+ self.status: ModelStatusMlflow
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class Signature(BaseModel):
7
+ """
8
+ MLFlow model signature.
9
+ """
10
+
11
+ inputs: str = None
12
+ outputs: str = None
13
+ params: str = None
14
+
15
+
16
+ class Dataset(BaseModel):
17
+ """
18
+ MLFlow model dataset.
19
+ """
20
+
21
+ name: str = None
22
+ digest: str = None
23
+ profile: str = None
24
+ schema_: str = Field(default=None, alias="schema")
25
+ source: str = None
26
+ source_type: str = None