isa-model 0.3.91__py3-none-any.whl → 0.4.3__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.
Files changed (228) hide show
  1. isa_model/client.py +1166 -584
  2. isa_model/core/cache/redis_cache.py +410 -0
  3. isa_model/core/config/config_manager.py +282 -12
  4. isa_model/core/config.py +91 -1
  5. isa_model/core/database/__init__.py +1 -0
  6. isa_model/core/database/direct_db_client.py +114 -0
  7. isa_model/core/database/migration_manager.py +563 -0
  8. isa_model/core/database/migrations.py +297 -0
  9. isa_model/core/database/supabase_client.py +258 -0
  10. isa_model/core/dependencies.py +316 -0
  11. isa_model/core/discovery/__init__.py +19 -0
  12. isa_model/core/discovery/consul_discovery.py +190 -0
  13. isa_model/core/logging/__init__.py +54 -0
  14. isa_model/core/logging/influx_logger.py +523 -0
  15. isa_model/core/logging/loki_logger.py +160 -0
  16. isa_model/core/models/__init__.py +46 -0
  17. isa_model/core/models/config_models.py +625 -0
  18. isa_model/core/models/deployment_billing_tracker.py +430 -0
  19. isa_model/core/models/model_billing_tracker.py +60 -88
  20. isa_model/core/models/model_manager.py +66 -25
  21. isa_model/core/models/model_metadata.py +690 -0
  22. isa_model/core/models/model_repo.py +217 -55
  23. isa_model/core/models/model_statistics_tracker.py +234 -0
  24. isa_model/core/models/model_storage.py +0 -1
  25. isa_model/core/models/model_version_manager.py +959 -0
  26. isa_model/core/models/system_models.py +857 -0
  27. isa_model/core/pricing_manager.py +2 -249
  28. isa_model/core/repositories/__init__.py +9 -0
  29. isa_model/core/repositories/config_repository.py +912 -0
  30. isa_model/core/resilience/circuit_breaker.py +366 -0
  31. isa_model/core/security/secrets.py +358 -0
  32. isa_model/core/services/__init__.py +2 -4
  33. isa_model/core/services/intelligent_model_selector.py +479 -370
  34. isa_model/core/storage/hf_storage.py +2 -2
  35. isa_model/core/types.py +8 -0
  36. isa_model/deployment/__init__.py +5 -48
  37. isa_model/deployment/core/__init__.py +2 -31
  38. isa_model/deployment/core/deployment_manager.py +1278 -368
  39. isa_model/deployment/local/__init__.py +31 -0
  40. isa_model/deployment/local/config.py +248 -0
  41. isa_model/deployment/local/gpu_gateway.py +607 -0
  42. isa_model/deployment/local/health_checker.py +428 -0
  43. isa_model/deployment/local/provider.py +586 -0
  44. isa_model/deployment/local/tensorrt_service.py +621 -0
  45. isa_model/deployment/local/transformers_service.py +644 -0
  46. isa_model/deployment/local/vllm_service.py +527 -0
  47. isa_model/deployment/modal/__init__.py +8 -0
  48. isa_model/deployment/modal/config.py +136 -0
  49. isa_model/deployment/modal/deployer.py +894 -0
  50. isa_model/deployment/modal/services/__init__.py +3 -0
  51. isa_model/deployment/modal/services/audio/__init__.py +1 -0
  52. isa_model/deployment/modal/services/audio/isa_audio_chatTTS_service.py +520 -0
  53. isa_model/deployment/modal/services/audio/isa_audio_openvoice_service.py +758 -0
  54. isa_model/deployment/modal/services/audio/isa_audio_service_v2.py +1044 -0
  55. isa_model/deployment/modal/services/embedding/__init__.py +1 -0
  56. isa_model/deployment/modal/services/embedding/isa_embed_rerank_service.py +296 -0
  57. isa_model/deployment/modal/services/llm/__init__.py +1 -0
  58. isa_model/deployment/modal/services/llm/isa_llm_service.py +424 -0
  59. isa_model/deployment/modal/services/video/__init__.py +1 -0
  60. isa_model/deployment/modal/services/video/isa_video_hunyuan_service.py +423 -0
  61. isa_model/deployment/modal/services/vision/__init__.py +1 -0
  62. isa_model/deployment/modal/services/vision/isa_vision_ocr_service.py +519 -0
  63. isa_model/deployment/modal/services/vision/isa_vision_qwen25_service.py +709 -0
  64. isa_model/deployment/modal/services/vision/isa_vision_table_service.py +676 -0
  65. isa_model/deployment/modal/services/vision/isa_vision_ui_service.py +833 -0
  66. isa_model/deployment/modal/services/vision/isa_vision_ui_service_optimized.py +660 -0
  67. isa_model/deployment/models/org-org-acme-corp-tenant-a-service-llm-20250825-225822/tenant-a-service_modal_service.py +48 -0
  68. isa_model/deployment/models/org-test-org-123-prefix-test-service-llm-20250825-225822/prefix-test-service_modal_service.py +48 -0
  69. isa_model/deployment/models/test-llm-service-llm-20250825-204442/test-llm-service_modal_service.py +48 -0
  70. isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-212906/test-monitoring-gpt2_modal_service.py +48 -0
  71. isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-213009/test-monitoring-gpt2_modal_service.py +48 -0
  72. isa_model/deployment/storage/__init__.py +5 -0
  73. isa_model/deployment/storage/deployment_repository.py +824 -0
  74. isa_model/deployment/triton/__init__.py +10 -0
  75. isa_model/deployment/triton/config.py +196 -0
  76. isa_model/deployment/triton/configs/__init__.py +1 -0
  77. isa_model/deployment/triton/provider.py +512 -0
  78. isa_model/deployment/triton/scripts/__init__.py +1 -0
  79. isa_model/deployment/triton/templates/__init__.py +1 -0
  80. isa_model/inference/__init__.py +47 -1
  81. isa_model/inference/ai_factory.py +179 -16
  82. isa_model/inference/legacy_services/__init__.py +21 -0
  83. isa_model/inference/legacy_services/model_evaluation.py +637 -0
  84. isa_model/inference/legacy_services/model_service.py +573 -0
  85. isa_model/inference/legacy_services/model_serving.py +717 -0
  86. isa_model/inference/legacy_services/model_training.py +561 -0
  87. isa_model/inference/models/__init__.py +21 -0
  88. isa_model/inference/models/inference_config.py +551 -0
  89. isa_model/inference/models/inference_record.py +675 -0
  90. isa_model/inference/models/performance_models.py +714 -0
  91. isa_model/inference/repositories/__init__.py +9 -0
  92. isa_model/inference/repositories/inference_repository.py +828 -0
  93. isa_model/inference/services/audio/__init__.py +21 -0
  94. isa_model/inference/services/audio/base_realtime_service.py +225 -0
  95. isa_model/inference/services/audio/base_stt_service.py +184 -11
  96. isa_model/inference/services/audio/isa_tts_service.py +0 -0
  97. isa_model/inference/services/audio/openai_realtime_service.py +320 -124
  98. isa_model/inference/services/audio/openai_stt_service.py +53 -11
  99. isa_model/inference/services/base_service.py +17 -1
  100. isa_model/inference/services/custom_model_manager.py +277 -0
  101. isa_model/inference/services/embedding/__init__.py +13 -0
  102. isa_model/inference/services/embedding/base_embed_service.py +111 -8
  103. isa_model/inference/services/embedding/isa_embed_service.py +305 -0
  104. isa_model/inference/services/embedding/ollama_embed_service.py +15 -3
  105. isa_model/inference/services/embedding/openai_embed_service.py +2 -4
  106. isa_model/inference/services/embedding/resilient_embed_service.py +285 -0
  107. isa_model/inference/services/embedding/tests/test_embedding.py +222 -0
  108. isa_model/inference/services/img/__init__.py +2 -2
  109. isa_model/inference/services/img/base_image_gen_service.py +24 -7
  110. isa_model/inference/services/img/replicate_image_gen_service.py +84 -422
  111. isa_model/inference/services/img/services/replicate_face_swap.py +193 -0
  112. isa_model/inference/services/img/services/replicate_flux.py +226 -0
  113. isa_model/inference/services/img/services/replicate_flux_kontext.py +219 -0
  114. isa_model/inference/services/img/services/replicate_sticker_maker.py +249 -0
  115. isa_model/inference/services/img/tests/test_img_client.py +297 -0
  116. isa_model/inference/services/llm/__init__.py +10 -2
  117. isa_model/inference/services/llm/base_llm_service.py +361 -26
  118. isa_model/inference/services/llm/cerebras_llm_service.py +628 -0
  119. isa_model/inference/services/llm/helpers/llm_adapter.py +71 -12
  120. isa_model/inference/services/llm/helpers/llm_prompts.py +342 -0
  121. isa_model/inference/services/llm/helpers/llm_utils.py +321 -23
  122. isa_model/inference/services/llm/huggingface_llm_service.py +581 -0
  123. isa_model/inference/services/llm/local_llm_service.py +747 -0
  124. isa_model/inference/services/llm/ollama_llm_service.py +11 -3
  125. isa_model/inference/services/llm/openai_llm_service.py +670 -56
  126. isa_model/inference/services/llm/yyds_llm_service.py +10 -3
  127. isa_model/inference/services/vision/__init__.py +27 -6
  128. isa_model/inference/services/vision/base_vision_service.py +118 -185
  129. isa_model/inference/services/vision/blip_vision_service.py +359 -0
  130. isa_model/inference/services/vision/helpers/image_utils.py +19 -10
  131. isa_model/inference/services/vision/isa_vision_service.py +634 -0
  132. isa_model/inference/services/vision/openai_vision_service.py +19 -10
  133. isa_model/inference/services/vision/tests/test_ocr_client.py +284 -0
  134. isa_model/inference/services/vision/vgg16_vision_service.py +257 -0
  135. isa_model/serving/api/cache_manager.py +245 -0
  136. isa_model/serving/api/dependencies/__init__.py +1 -0
  137. isa_model/serving/api/dependencies/auth.py +194 -0
  138. isa_model/serving/api/dependencies/database.py +139 -0
  139. isa_model/serving/api/error_handlers.py +284 -0
  140. isa_model/serving/api/fastapi_server.py +240 -18
  141. isa_model/serving/api/middleware/auth.py +317 -0
  142. isa_model/serving/api/middleware/security.py +268 -0
  143. isa_model/serving/api/middleware/tenant_context.py +414 -0
  144. isa_model/serving/api/routes/analytics.py +489 -0
  145. isa_model/serving/api/routes/config.py +645 -0
  146. isa_model/serving/api/routes/deployment_billing.py +315 -0
  147. isa_model/serving/api/routes/deployments.py +475 -0
  148. isa_model/serving/api/routes/gpu_gateway.py +440 -0
  149. isa_model/serving/api/routes/health.py +32 -12
  150. isa_model/serving/api/routes/inference_monitoring.py +486 -0
  151. isa_model/serving/api/routes/local_deployments.py +448 -0
  152. isa_model/serving/api/routes/logs.py +430 -0
  153. isa_model/serving/api/routes/settings.py +582 -0
  154. isa_model/serving/api/routes/tenants.py +575 -0
  155. isa_model/serving/api/routes/unified.py +992 -171
  156. isa_model/serving/api/routes/webhooks.py +479 -0
  157. isa_model/serving/api/startup.py +318 -0
  158. isa_model/serving/modal_proxy_server.py +249 -0
  159. isa_model/utils/gpu_utils.py +311 -0
  160. {isa_model-0.3.91.dist-info → isa_model-0.4.3.dist-info}/METADATA +76 -22
  161. isa_model-0.4.3.dist-info/RECORD +193 -0
  162. isa_model/deployment/cloud/__init__.py +0 -9
  163. isa_model/deployment/cloud/modal/__init__.py +0 -10
  164. isa_model/deployment/cloud/modal/isa_vision_doc_service.py +0 -766
  165. isa_model/deployment/cloud/modal/isa_vision_table_service.py +0 -532
  166. isa_model/deployment/cloud/modal/isa_vision_ui_service.py +0 -406
  167. isa_model/deployment/cloud/modal/register_models.py +0 -321
  168. isa_model/deployment/core/deployment_config.py +0 -356
  169. isa_model/deployment/core/isa_deployment_service.py +0 -401
  170. isa_model/deployment/gpu_int8_ds8/app/server.py +0 -66
  171. isa_model/deployment/gpu_int8_ds8/scripts/test_client.py +0 -43
  172. isa_model/deployment/gpu_int8_ds8/scripts/test_client_os.py +0 -35
  173. isa_model/deployment/runtime/deployed_service.py +0 -338
  174. isa_model/deployment/services/__init__.py +0 -9
  175. isa_model/deployment/services/auto_deploy_vision_service.py +0 -538
  176. isa_model/deployment/services/model_service.py +0 -332
  177. isa_model/deployment/services/service_monitor.py +0 -356
  178. isa_model/deployment/services/service_registry.py +0 -527
  179. isa_model/eval/__init__.py +0 -92
  180. isa_model/eval/benchmarks.py +0 -469
  181. isa_model/eval/config/__init__.py +0 -10
  182. isa_model/eval/config/evaluation_config.py +0 -108
  183. isa_model/eval/evaluators/__init__.py +0 -18
  184. isa_model/eval/evaluators/base_evaluator.py +0 -503
  185. isa_model/eval/evaluators/llm_evaluator.py +0 -472
  186. isa_model/eval/factory.py +0 -531
  187. isa_model/eval/infrastructure/__init__.py +0 -24
  188. isa_model/eval/infrastructure/experiment_tracker.py +0 -466
  189. isa_model/eval/metrics.py +0 -798
  190. isa_model/inference/adapter/unified_api.py +0 -248
  191. isa_model/inference/services/helpers/stacked_config.py +0 -148
  192. isa_model/inference/services/img/flux_professional_service.py +0 -603
  193. isa_model/inference/services/img/helpers/base_stacked_service.py +0 -274
  194. isa_model/inference/services/others/table_transformer_service.py +0 -61
  195. isa_model/inference/services/vision/doc_analysis_service.py +0 -640
  196. isa_model/inference/services/vision/helpers/base_stacked_service.py +0 -274
  197. isa_model/inference/services/vision/ui_analysis_service.py +0 -823
  198. isa_model/scripts/inference_tracker.py +0 -283
  199. isa_model/scripts/mlflow_manager.py +0 -379
  200. isa_model/scripts/model_registry.py +0 -465
  201. isa_model/scripts/register_models.py +0 -370
  202. isa_model/scripts/register_models_with_embeddings.py +0 -510
  203. isa_model/scripts/start_mlflow.py +0 -95
  204. isa_model/scripts/training_tracker.py +0 -257
  205. isa_model/training/__init__.py +0 -74
  206. isa_model/training/annotation/annotation_schema.py +0 -47
  207. isa_model/training/annotation/processors/annotation_processor.py +0 -126
  208. isa_model/training/annotation/storage/dataset_manager.py +0 -131
  209. isa_model/training/annotation/storage/dataset_schema.py +0 -44
  210. isa_model/training/annotation/tests/test_annotation_flow.py +0 -109
  211. isa_model/training/annotation/tests/test_minio copy.py +0 -113
  212. isa_model/training/annotation/tests/test_minio_upload.py +0 -43
  213. isa_model/training/annotation/views/annotation_controller.py +0 -158
  214. isa_model/training/cloud/__init__.py +0 -22
  215. isa_model/training/cloud/job_orchestrator.py +0 -402
  216. isa_model/training/cloud/runpod_trainer.py +0 -454
  217. isa_model/training/cloud/storage_manager.py +0 -482
  218. isa_model/training/core/__init__.py +0 -23
  219. isa_model/training/core/config.py +0 -181
  220. isa_model/training/core/dataset.py +0 -222
  221. isa_model/training/core/trainer.py +0 -720
  222. isa_model/training/core/utils.py +0 -213
  223. isa_model/training/factory.py +0 -424
  224. isa_model-0.3.91.dist-info/RECORD +0 -138
  225. /isa_model/{core/storage/minio_storage.py → deployment/modal/services/audio/isa_audio_fish_service.py} +0 -0
  226. /isa_model/deployment/{services → modal/services/vision}/simple_auto_deploy_vision_service.py +0 -0
  227. {isa_model-0.3.91.dist-info → isa_model-0.4.3.dist-info}/WHEEL +0 -0
  228. {isa_model-0.3.91.dist-info → isa_model-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,465 +0,0 @@
1
- """
2
- Model registry for managing model versions and stages.
3
- """
4
-
5
- import os
6
- import logging
7
- from enum import Enum
8
- from typing import Dict, List, Optional, Any, Union, Tuple
9
- import mlflow
10
- from mlflow.tracking import MlflowClient
11
- from mlflow.entities.model_registry import ModelVersion as MlflowModelVersion
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
-
16
- class ModelStage(str, Enum):
17
- """Stages of a model in the registry."""
18
-
19
- STAGING = "Staging"
20
- PRODUCTION = "Production"
21
- ARCHIVED = "Archived"
22
- NONE = "None"
23
-
24
-
25
- class ModelVersion:
26
- """
27
- Model version representation.
28
-
29
- This class provides a wrapper around MLflow's ModelVersion entity
30
- with additional functionality.
31
- """
32
-
33
- def __init__(self, mlflow_model_version: MlflowModelVersion):
34
- """
35
- Initialize a model version.
36
-
37
- Args:
38
- mlflow_model_version: MLflow model version entity
39
- """
40
- self.mlflow_version = mlflow_model_version
41
-
42
- @property
43
- def name(self) -> str:
44
- """Get the model name."""
45
- return self.mlflow_version.name
46
-
47
- @property
48
- def version(self) -> str:
49
- """Get the version number."""
50
- return self.mlflow_version.version
51
-
52
- @property
53
- def stage(self) -> ModelStage:
54
- """Get the model stage."""
55
- return ModelStage(self.mlflow_version.current_stage)
56
-
57
- @property
58
- def description(self) -> str:
59
- """Get the model description."""
60
- return self.mlflow_version.description or ""
61
-
62
- @property
63
- def source(self) -> str:
64
- """Get the model source path."""
65
- return self.mlflow_version.source
66
-
67
- @property
68
- def run_id(self) -> str:
69
- """Get the run ID that created this model."""
70
- return self.mlflow_version.run_id
71
-
72
- @property
73
- def tags(self) -> Dict[str, str]:
74
- """Get the model tags."""
75
- return self.mlflow_version.tags or {}
76
-
77
- def to_dict(self) -> Dict[str, Any]:
78
- """
79
- Convert the model version to a dictionary.
80
-
81
- Returns:
82
- Dictionary representation of the model version
83
- """
84
- return {
85
- "name": self.name,
86
- "version": self.version,
87
- "stage": self.stage.value,
88
- "description": self.description,
89
- "source": self.source,
90
- "run_id": self.run_id,
91
- "tags": self.tags
92
- }
93
-
94
-
95
- class ModelRegistry:
96
- """
97
- Registry for managing models and their versions.
98
-
99
- This class provides methods to register models, transition between
100
- stages, and retrieve models from the registry.
101
-
102
- Example:
103
- ```python
104
- # Create model registry
105
- registry = ModelRegistry(
106
- tracking_uri="http://localhost:5000",
107
- registry_uri="http://localhost:5000"
108
- )
109
-
110
- # Register a model
111
- version = registry.register_model(
112
- name="llama-7b-finetuned",
113
- source="path/to/model",
114
- description="Llama 7B finetuned on custom data"
115
- )
116
-
117
- # Transition to staging
118
- registry.transition_model_version_stage(
119
- name="llama-7b-finetuned",
120
- version=version,
121
- stage=ModelStage.STAGING
122
- )
123
-
124
- # Get the latest staging model
125
- staging_model = registry.get_latest_model_version(
126
- name="llama-7b-finetuned",
127
- stage=ModelStage.STAGING
128
- )
129
- ```
130
- """
131
-
132
- def __init__(
133
- self,
134
- tracking_uri: Optional[str] = None,
135
- registry_uri: Optional[str] = None
136
- ):
137
- """
138
- Initialize the model registry.
139
-
140
- Args:
141
- tracking_uri: URI for MLflow tracking server
142
- registry_uri: URI for MLflow model registry
143
- """
144
- self.tracking_uri = tracking_uri or os.environ.get("MLFLOW_TRACKING_URI", "")
145
- self.registry_uri = registry_uri or os.environ.get("MLFLOW_REGISTRY_URI", "")
146
-
147
- self._setup_mlflow()
148
- self.client = MlflowClient(tracking_uri=self.tracking_uri, registry_uri=self.registry_uri)
149
-
150
- def _setup_mlflow(self) -> None:
151
- """Set up MLflow configuration."""
152
- if self.tracking_uri:
153
- mlflow.set_tracking_uri(self.tracking_uri)
154
-
155
- if self.registry_uri:
156
- mlflow.set_registry_uri(self.registry_uri)
157
-
158
- def create_registered_model(
159
- self,
160
- name: str,
161
- tags: Optional[Dict[str, str]] = None,
162
- description: Optional[str] = None
163
- ) -> bool:
164
- """
165
- Create a new registered model if it doesn't exist.
166
-
167
- Args:
168
- name: Name for the registered model
169
- tags: Tags for the registered model
170
- description: Description for the registered model
171
-
172
- Returns:
173
- True if successful, False otherwise
174
- """
175
- try:
176
- self.client.create_registered_model(
177
- name=name,
178
- tags=tags,
179
- description=description
180
- )
181
- logger.info(f"Created registered model: {name}")
182
- return True
183
- except mlflow.exceptions.MlflowException as e:
184
- if "already exists" in str(e):
185
- logger.info(f"Model {name} already exists, skipping creation")
186
- return True
187
- logger.error(f"Failed to create registered model: {e}")
188
- return False
189
-
190
- def register_model(
191
- self,
192
- name: str,
193
- source: str,
194
- description: Optional[str] = None,
195
- tags: Optional[Dict[str, str]] = None
196
- ) -> Optional[str]:
197
- """
198
- Register a model with the registry.
199
-
200
- Args:
201
- name: Name for the registered model
202
- source: Source path of the model
203
- description: Description for the model version
204
- tags: Tags for the model version
205
-
206
- Returns:
207
- Version of the registered model or None if registration failed
208
- """
209
- # Ensure registered model exists
210
- self.create_registered_model(name)
211
-
212
- try:
213
- model_version = self.client.create_model_version(
214
- name=name,
215
- source=source,
216
- description=description,
217
- tags=tags
218
- )
219
- version = model_version.version
220
- logger.info(f"Registered model version: {name} v{version}")
221
- return version
222
- except mlflow.exceptions.MlflowException as e:
223
- logger.error(f"Failed to register model: {e}")
224
- return None
225
-
226
- def get_model_version(
227
- self,
228
- name: str,
229
- version: str
230
- ) -> Optional[ModelVersion]:
231
- """
232
- Get a specific model version.
233
-
234
- Args:
235
- name: Name of the registered model
236
- version: Version of the model
237
-
238
- Returns:
239
- ModelVersion entity or None if not found
240
- """
241
- try:
242
- mlflow_version = self.client.get_model_version(name=name, version=version)
243
- return ModelVersion(mlflow_version)
244
- except mlflow.exceptions.MlflowException as e:
245
- logger.error(f"Failed to get model version: {e}")
246
- return None
247
-
248
- def get_latest_model_version(
249
- self,
250
- name: str,
251
- stage: Optional[ModelStage] = None
252
- ) -> Optional[ModelVersion]:
253
- """
254
- Get the latest version of a model, optionally filtering by stage.
255
-
256
- Args:
257
- name: Name of the registered model
258
- stage: Stage to filter by
259
-
260
- Returns:
261
- Latest ModelVersion or None if not found
262
- """
263
- try:
264
- filter_string = f"name='{name}'"
265
- if stage:
266
- filter_string += f" AND stage='{stage.value}'"
267
-
268
- versions = self.client.search_model_versions(filter_string=filter_string)
269
-
270
- if not versions:
271
- logger.warning(f"No model versions found for {name}")
272
- return None
273
-
274
- # Sort by version number (newest first)
275
- sorted_versions = sorted(
276
- versions,
277
- key=lambda v: int(v.version),
278
- reverse=True
279
- )
280
-
281
- return ModelVersion(sorted_versions[0])
282
- except mlflow.exceptions.MlflowException as e:
283
- logger.error(f"Failed to get latest model version: {e}")
284
- return None
285
-
286
- def list_model_versions(
287
- self,
288
- name: str,
289
- stage: Optional[ModelStage] = None
290
- ) -> List[ModelVersion]:
291
- """
292
- List all versions of a model, optionally filtering by stage.
293
-
294
- Args:
295
- name: Name of the registered model
296
- stage: Stage to filter by
297
-
298
- Returns:
299
- List of ModelVersion entities
300
- """
301
- try:
302
- filter_string = f"name='{name}'"
303
- if stage:
304
- filter_string += f" AND stage='{stage.value}'"
305
-
306
- mlflow_versions = self.client.search_model_versions(filter_string=filter_string)
307
-
308
- return [ModelVersion(v) for v in mlflow_versions]
309
- except mlflow.exceptions.MlflowException as e:
310
- logger.error(f"Failed to list model versions: {e}")
311
- return []
312
-
313
- def list_registered_models(self) -> List[str]:
314
- """
315
- List all registered models in the registry.
316
-
317
- Returns:
318
- List of registered model names
319
- """
320
- try:
321
- models = self.client.list_registered_models()
322
- return [model.name for model in models]
323
- except mlflow.exceptions.MlflowException as e:
324
- logger.error(f"Failed to list registered models: {e}")
325
- return []
326
-
327
- def transition_model_version_stage(
328
- self,
329
- name: str,
330
- version: str,
331
- stage: ModelStage,
332
- archive_existing_versions: bool = False
333
- ) -> Optional[ModelVersion]:
334
- """
335
- Transition a model version to a different stage.
336
-
337
- Args:
338
- name: Name of the registered model
339
- version: Version of the model
340
- stage: Stage to transition to
341
- archive_existing_versions: Whether to archive existing versions in the target stage
342
-
343
- Returns:
344
- Updated ModelVersion or None if transition failed
345
- """
346
- try:
347
- mlflow_version = self.client.transition_model_version_stage(
348
- name=name,
349
- version=version,
350
- stage=stage.value,
351
- archive_existing_versions=archive_existing_versions
352
- )
353
- logger.info(f"Transitioned model {name} v{version} to {stage.value}")
354
- return ModelVersion(mlflow_version)
355
- except mlflow.exceptions.MlflowException as e:
356
- logger.error(f"Failed to transition model version: {e}")
357
- return None
358
-
359
- def update_model_version(
360
- self,
361
- name: str,
362
- version: str,
363
- description: Optional[str] = None
364
- ) -> Optional[ModelVersion]:
365
- """
366
- Update a model version's metadata.
367
-
368
- Args:
369
- name: Name of the registered model
370
- version: Version of the model
371
- description: New description for the model version
372
-
373
- Returns:
374
- Updated ModelVersion or None if update failed
375
- """
376
- try:
377
- mlflow_version = self.client.update_model_version(
378
- name=name,
379
- version=version,
380
- description=description
381
- )
382
- logger.info(f"Updated model version: {name} v{version}")
383
- return ModelVersion(mlflow_version)
384
- except mlflow.exceptions.MlflowException as e:
385
- logger.error(f"Failed to update model version: {e}")
386
- return None
387
-
388
- def set_model_version_tag(
389
- self,
390
- name: str,
391
- version: str,
392
- key: str,
393
- value: str
394
- ) -> bool:
395
- """
396
- Set a tag on a model version.
397
-
398
- Args:
399
- name: Name of the registered model
400
- version: Version of the model
401
- key: Tag key
402
- value: Tag value
403
-
404
- Returns:
405
- True if successful, False otherwise
406
- """
407
- try:
408
- self.client.set_model_version_tag(
409
- name=name,
410
- version=version,
411
- key=key,
412
- value=value
413
- )
414
- logger.debug(f"Set tag {key}={value} on model {name} v{version}")
415
- return True
416
- except mlflow.exceptions.MlflowException as e:
417
- logger.error(f"Failed to set model version tag: {e}")
418
- return False
419
-
420
- def delete_model_version(
421
- self,
422
- name: str,
423
- version: str
424
- ) -> bool:
425
- """
426
- Delete a model version.
427
-
428
- Args:
429
- name: Name of the registered model
430
- version: Version of the model
431
-
432
- Returns:
433
- True if successful, False otherwise
434
- """
435
- try:
436
- self.client.delete_model_version(
437
- name=name,
438
- version=version
439
- )
440
- logger.info(f"Deleted model version: {name} v{version}")
441
- return True
442
- except mlflow.exceptions.MlflowException as e:
443
- logger.error(f"Failed to delete model version: {e}")
444
- return False
445
-
446
- def delete_registered_model(
447
- self,
448
- name: str
449
- ) -> bool:
450
- """
451
- Delete a registered model and all its versions.
452
-
453
- Args:
454
- name: Name of the registered model
455
-
456
- Returns:
457
- True if successful, False otherwise
458
- """
459
- try:
460
- self.client.delete_registered_model(name=name)
461
- logger.info(f"Deleted registered model: {name}")
462
- return True
463
- except mlflow.exceptions.MlflowException as e:
464
- logger.error(f"Failed to delete registered model: {e}")
465
- return False