Skip to content

Commit 7396f9f

Browse files
committed
add lifecycle stage to aimodel
1 parent c1ccddd commit 7396f9f

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

api/models/AIModelVersion.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from django.db import models
88

9-
from api.utils.enums import AIModelStatus
9+
from api.utils.enums import AIModelLifecycleStage, AIModelStatus
1010

1111
if TYPE_CHECKING:
1212
from django.db.models import QuerySet
@@ -36,12 +36,18 @@ class AIModelVersion(models.Model):
3636
output_schema = models.JSONField(default=dict, help_text="Expected output format")
3737
metadata = models.JSONField(default=dict, help_text="Additional version-specific metadata")
3838

39-
# Status
39+
# Status & Lifecycle
4040
status = models.CharField(
4141
max_length=20,
4242
choices=AIModelStatus.choices,
4343
default=AIModelStatus.REGISTERED,
4444
)
45+
lifecycle_stage = models.CharField(
46+
max_length=20,
47+
choices=AIModelLifecycleStage.choices,
48+
default=AIModelLifecycleStage.DEVELOPMENT,
49+
help_text="Current lifecycle stage of this version",
50+
)
4551
is_latest = models.BooleanField(default=False, help_text="Whether this is the latest version")
4652

4753
# Timestamps

api/schema/aimodel_schema.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from api.schema.extensions import TrackActivity, TrackModelActivity
1919
from api.types.type_aimodel import (
2020
AIModelFilter,
21+
AIModelLifecycleStageEnum,
2122
AIModelOrder,
2223
AIModelProviderEnum,
2324
AIModelStatusEnum,
@@ -169,13 +170,15 @@ class CreateAIModelVersionInput:
169170
model_id: int
170171
version: str
171172
version_notes: Optional[str] = ""
173+
lifecycle_stage: Optional[AIModelLifecycleStageEnum] = None
172174
supports_streaming: bool = False
173175
max_tokens: Optional[int] = None
174176
supported_languages: Optional[List[str]] = None
175177
input_schema: Optional[strawberry.scalars.JSON] = None
176178
output_schema: Optional[strawberry.scalars.JSON] = None
177179
metadata: Optional[strawberry.scalars.JSON] = None
178180
copy_from_version_id: Optional[int] = None
181+
is_latest: Optional[bool] = None
179182

180183

181184
@strawberry.input
@@ -185,6 +188,7 @@ class UpdateAIModelVersionInput:
185188
id: int
186189
version: Optional[str] = None
187190
version_notes: Optional[str] = None
191+
lifecycle_stage: Optional[AIModelLifecycleStageEnum] = None
188192
supports_streaming: Optional[bool] = None
189193
max_tokens: Optional[int] = None
190194
supported_languages: Optional[List[str]] = None
@@ -748,14 +752,15 @@ def create_ai_model_version(
748752
ai_model=model,
749753
version=input.version,
750754
version_notes=input.version_notes or "",
755+
lifecycle_stage=input.lifecycle_stage.value if input.lifecycle_stage else "DEVELOPMENT", # type: ignore[misc]
751756
supports_streaming=input.supports_streaming,
752757
max_tokens=input.max_tokens,
753758
supported_languages=input.supported_languages or [],
754759
input_schema=input.input_schema or {},
755760
output_schema=input.output_schema or {},
756761
metadata=input.metadata or {},
757762
status="DRAFT",
758-
is_latest=True,
763+
is_latest=input.is_latest if input.is_latest is not None else True,
759764
)
760765

761766
# If copy_from_version_id is provided, copy all providers
@@ -803,6 +808,8 @@ def update_ai_model_version(
803808
version.version = input.version
804809
if input.version_notes is not None:
805810
version.version_notes = input.version_notes
811+
if input.lifecycle_stage is not None:
812+
version.lifecycle_stage = input.lifecycle_stage.value # type: ignore[misc]
806813
if input.supports_streaming is not None:
807814
version.supports_streaming = input.supports_streaming
808815
if input.max_tokens is not None:

api/types/type_aimodel.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from api.types.type_sector import TypeSector
2020
from api.utils.enums import (
2121
AIModelFramework,
22+
AIModelLifecycleStage,
2223
AIModelProvider,
2324
AIModelStatus,
2425
AIModelType,
@@ -39,6 +40,7 @@
3940
EndpointHTTPMethodEnum = strawberry.enum(EndpointHTTPMethod) # type: ignore
4041
AIModelFrameworkEnum = strawberry.enum(AIModelFramework) # type: ignore
4142
HFModelClassEnum = strawberry.enum(HFModelClass) # type: ignore
43+
AIModelLifecycleStageEnum = strawberry.enum(AIModelLifecycleStage) # type: ignore
4244

4345

4446
@strawberry.type
@@ -195,7 +197,8 @@ def primary_endpoint(self) -> Optional[TypeModelEndpoint]:
195197
def versions(self) -> List["TypeAIModelVersion"]:
196198
"""Get all versions of this AI model."""
197199
try:
198-
queryset = self.versions.all() # type: ignore
200+
django_instance = cast(AIModel, self)
201+
queryset = django_instance.versions.all()
199202
return TypeAIModelVersion.from_django_list(list(queryset))
200203
except Exception:
201204
return []
@@ -204,9 +207,10 @@ def versions(self) -> List["TypeAIModelVersion"]:
204207
def latest_version(self) -> Optional["TypeAIModelVersion"]:
205208
"""Get the latest version of this AI model."""
206209
try:
207-
version = self.versions.filter(is_latest=True).first() # type: ignore
210+
django_instance = cast(AIModel, self)
211+
version = django_instance.versions.filter(is_latest=True).first()
208212
if not version:
209-
version = self.versions.order_by("-created_at").first() # type: ignore
213+
version = django_instance.versions.order_by("-created_at").first()
210214
if version:
211215
return TypeAIModelVersion.from_django(version)
212216
return None
@@ -265,6 +269,7 @@ class TypeAIModelVersion(BaseType):
265269
output_schema: strawberry.scalars.JSON
266270
metadata: strawberry.scalars.JSON
267271
status: AIModelStatusEnum
272+
lifecycle_stage: AIModelLifecycleStageEnum
268273
is_latest: bool
269274
created_at: datetime
270275
updated_at: datetime

api/utils/enums.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,16 @@ class AIModelProvider(models.TextChoices):
189189
HUGGINGFACE = "HUGGINGFACE"
190190

191191

192+
class AIModelLifecycleStage(models.TextChoices):
193+
DEVELOPMENT = "DEVELOPMENT", "Development"
194+
TESTING = "TESTING", "Testing"
195+
BETA = "BETA", "Beta Testing"
196+
STAGING = "STAGING", "Staging"
197+
PRODUCTION = "PRODUCTION", "Production"
198+
DEPRECATED = "DEPRECATED", "Deprecated"
199+
RETIRED = "RETIRED", "Retired"
200+
201+
192202
class AIModelFramework(models.TextChoices):
193203
PYTORCH = "pt", "PyTorch"
194204
TENSORFLOW = "tf", "TensorFlow"

0 commit comments

Comments
 (0)