Skip to content

Commit 54e5cf4

Browse files
jopemachineclaudelablup-octodog
authored
fix(BA-6024): relax AddRevisionInput schema to accept a draft (#11585)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: octodog <mu001@lablup.com>
1 parent 9016647 commit 54e5cf4

21 files changed

Lines changed: 269 additions & 260 deletions

File tree

changes/11585.fix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Make `AddRevisionInput` fields optional except `deployment_id`.

docs/manager/graphql-reference/supergraph.graphql

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,17 +151,25 @@ type ActiveResourceOverview
151151
input AddRevisionInput
152152
@join__type(graph: STRAWBERRY)
153153
{
154-
name: String = null
155-
156154
"""
157155
Added in 26.4.2. DeploymentRevisionPreset ID. When specified, preset values are used as defaults and can be overridden by explicitly provided fields.
158156
"""
159157
revisionPresetId: UUID = null
160158
deploymentId: ID!
161-
clusterConfig: ClusterConfigInput!
162-
resourceConfig: ResourceConfigInput!
163-
image: ImageInput!
164-
modelRuntimeConfig: ModelRuntimeConfigInput!
159+
160+
"""Cluster configuration"""
161+
clusterConfig: ClusterConfigInput = null
162+
163+
"""Resource configuration"""
164+
resourceConfig: ResourceConfigInput = null
165+
166+
"""Container image"""
167+
image: ImageInput = null
168+
169+
"""Runtime configuration"""
170+
modelRuntimeConfig: ModelRuntimeConfigInput = null
171+
172+
"""Model mount configuration"""
165173
modelMountConfig: ModelMountConfigInput!
166174

167175
"""
@@ -3843,8 +3851,6 @@ Added in 25.19.0. Input for specifying revision configuration within a deploymen
38433851
input CreateRevisionInput
38443852
@join__type(graph: STRAWBERRY)
38453853
{
3846-
name: String = null
3847-
38483854
"""
38493855
Added in 26.4.2. DeploymentRevisionPreset ID. When specified, preset values are used as defaults and can be overridden by explicitly provided fields.
38503856
"""
@@ -9778,7 +9784,6 @@ input ModelRuntimeConfigInput
97789784
@join__type(graph: STRAWBERRY)
97799785
{
97809786
runtimeVariantId: UUID!
9781-
inferenceRuntimeConfig: JSON = null
97829787

97839788
"""Environment variables for the service."""
97849789
environ: EnvironmentVariablesInput = null
@@ -14056,10 +14061,10 @@ type Query
1405614061
"""
1405714062
Added in 25.16.0. Get configuration JSON Schemas for all inference runtimes.
1405814063
"""
14059-
inferenceRuntimeConfigs: JSON @join__field(graph: STRAWBERRY)
14064+
inferenceRuntimeConfigs: JSON @join__field(graph: STRAWBERRY) @deprecated(reason: "Deprecated since UNRELEASED. Use the runtime_variant resources instead.")
1406014065

1406114066
"""Added in 25.16.0. Get JSON Schema for inference runtime configuration"""
14062-
inferenceRuntimeConfig(name: String!): JSON @join__field(graph: STRAWBERRY)
14067+
inferenceRuntimeConfig(name: String!): JSON @join__field(graph: STRAWBERRY) @deprecated(reason: "Deprecated since UNRELEASED. Use the runtime_variant resources instead.")
1406314068

1406414069
"""Added in 25.19.0. Get a specific route by ID."""
1406514070
route(id: ID!): Route @join__field(graph: STRAWBERRY)

docs/manager/graphql-reference/v2-schema.graphql

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,25 @@ enum ActivenessStatus {
109109

110110
"""Added in 25.19.0. """
111111
input AddRevisionInput {
112-
name: String = null
113-
114112
"""
115113
Added in 26.4.2. DeploymentRevisionPreset ID. When specified, preset values are used as defaults and can be overridden by explicitly provided fields.
116114
"""
117115
revisionPresetId: UUID = null
118116
deploymentId: ID!
119-
clusterConfig: ClusterConfigInput!
120-
resourceConfig: ResourceConfigInput!
121-
image: ImageInput!
122-
modelRuntimeConfig: ModelRuntimeConfigInput!
117+
118+
"""Cluster configuration"""
119+
clusterConfig: ClusterConfigInput = null
120+
121+
"""Resource configuration"""
122+
resourceConfig: ResourceConfigInput = null
123+
124+
"""Container image"""
125+
image: ImageInput = null
126+
127+
"""Runtime configuration"""
128+
modelRuntimeConfig: ModelRuntimeConfigInput = null
129+
130+
"""Model mount configuration"""
123131
modelMountConfig: ModelMountConfigInput!
124132

125133
"""
@@ -2423,8 +2431,6 @@ input CreateResourcePresetV2Input {
24232431
Added in 25.19.0. Input for specifying revision configuration within a deployment.
24242432
"""
24252433
input CreateRevisionInput {
2426-
name: String = null
2427-
24282434
"""
24292435
Added in 26.4.2. DeploymentRevisionPreset ID. When specified, preset values are used as defaults and can be overridden by explicitly provided fields.
24302436
"""
@@ -6533,7 +6539,6 @@ type ModelRuntimeConfig {
65336539
"""Added in 25.19.0. """
65346540
input ModelRuntimeConfigInput {
65356541
runtimeVariantId: UUID!
6536-
inferenceRuntimeConfig: JSON = null
65376542

65386543
"""Environment variables for the service."""
65396544
environ: EnvironmentVariablesInput = null
@@ -9180,10 +9185,10 @@ type Query {
91809185
"""
91819186
Added in 25.16.0. Get configuration JSON Schemas for all inference runtimes.
91829187
"""
9183-
inferenceRuntimeConfigs: JSON
9188+
inferenceRuntimeConfigs: JSON @deprecated(reason: "Deprecated since UNRELEASED. Use the runtime_variant resources instead.")
91849189

91859190
"""Added in 25.16.0. Get JSON Schema for inference runtime configuration"""
9186-
inferenceRuntimeConfig(name: String!): JSON
9191+
inferenceRuntimeConfig(name: String!): JSON @deprecated(reason: "Deprecated since UNRELEASED. Use the runtime_variant resources instead.")
91879192

91889193
"""Added in 25.19.0. Get a specific route by ID."""
91899194
route(id: ID!): Route

src/ai/backend/client/cli/v2/deployment/commands.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,21 +149,21 @@ def create(
149149
from ai.backend.common.data.model_deployment.types import DeploymentStrategy
150150
from ai.backend.common.dto.manager.v2.deployment.request import (
151151
CreateDeploymentInput,
152-
CreateRevisionInputDTO,
152+
CreateRevisionInput,
153153
DeploymentStrategyInput,
154154
ModelDeploymentMetadataInput,
155155
ModelDeploymentNetworkAccessInput,
156156
)
157157
from ai.backend.common.identifier.resource_group import ResourceGroupName
158158

159-
revision_dto: CreateRevisionInputDTO | None = None
159+
revision_dto: CreateRevisionInput | None = None
160160
if initial_revision is not None:
161161
if initial_revision.startswith("@"):
162162
with Path(initial_revision[1:]).open() as f:
163163
rev_data = json.load(f)
164164
else:
165165
rev_data = json.loads(initial_revision)
166-
revision_dto = CreateRevisionInputDTO.model_validate(rev_data)
166+
revision_dto = CreateRevisionInput.model_validate(rev_data)
167167

168168
body = CreateDeploymentInput(
169169
metadata=ModelDeploymentMetadataInput(

src/ai/backend/client/cli/v2/deployment/revision.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def add(deployment_id: str, config: str, preset_id: str | None, auto_activate: b
3737
"""Add a new revision to a deployment."""
3838

3939
from ai.backend.common.dto.manager.v2.deployment.request import (
40-
AddRevisionGQLInputDTO,
40+
AddRevisionInput,
4141
)
4242

4343
if config.startswith("@"):
@@ -50,7 +50,7 @@ def add(deployment_id: str, config: str, preset_id: str | None, auto_activate: b
5050
if preset_id is not None:
5151
data["revision_preset_id"] = preset_id
5252
data["auto_activate"] = auto_activate
53-
body = AddRevisionGQLInputDTO.model_validate(data)
53+
body = AddRevisionInput.model_validate(data)
5454

5555
async def _run() -> None:
5656
registry = await create_v2_registry(load_v2_config())

src/ai/backend/client/v2/domains_v2/deployment.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
)
1414
from ai.backend.common.dto.manager.v2.deployment.request import (
1515
ActivateRevisionInput,
16-
AddRevisionGQLInputDTO,
16+
AddRevisionInput,
1717
AdminSearchDeploymentsInput,
1818
AdminSearchRevisionsInput,
1919
BulkDeleteAccessTokensInput,
@@ -169,7 +169,7 @@ async def delete(
169169
async def add_revision(
170170
self,
171171
deployment_id: UUID,
172-
body: AddRevisionGQLInputDTO,
172+
body: AddRevisionInput,
173173
) -> AddRevisionPayload:
174174
"""Add a new model revision to a deployment."""
175175
return await self._client.typed_request(

src/ai/backend/common/dto/manager/deployment/request.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ class ExtraVFolderMountInput(BaseRequestModel):
279279
class RevisionInput(BaseRequestModel):
280280
"""Revision input for creating a new revision."""
281281

282-
name: str | None = Field(default=None, description="Revision name")
283282
cluster_config: ClusterConfigInput = Field(description="Cluster configuration")
284283
resource_config: ResourceConfigInput = Field(description="Resource configuration")
285284
image: ImageInput = Field(description="Container image")

src/ai/backend/common/dto/manager/v2/deployment/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
ResourceSlotEntryInput,
4646
ResourceSlotInput,
4747
RevisionFilter,
48-
RevisionInput,
4948
RevisionOrder,
5049
RollingUpdateConfigInput,
5150
RouteFilter,
@@ -211,7 +210,6 @@
211210
"ResourceSlotEntryInput",
212211
"ResourceSlotInput",
213212
"RevisionFilter",
214-
"RevisionInput",
215213
"RevisionOrder",
216214
"RollingUpdateConfigInput",
217215
"RouteFilter",

src/ai/backend/common/dto/manager/v2/deployment/request.py

Lines changed: 14 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from __future__ import annotations
66

7-
from collections.abc import Mapping
87
from datetime import datetime
98
from decimal import Decimal
109
from typing import Any
@@ -61,15 +60,14 @@
6160
"AccessTokenOrder",
6261
"ActivateDeploymentInput",
6362
"ActivateRevisionInput",
64-
"AddRevisionGQLInputDTO",
6563
"AddRevisionInput",
6664
"AdminSearchDeploymentsInput",
6765
"AdminSearchRevisionsInput",
6866
"AutoScalingRuleFilter",
6967
"AutoScalingRuleOrder",
7068
"BlueGreenConfigInput",
7169
"ClusterConfigInput",
72-
"CreateRevisionInputDTO",
70+
"CreateRevisionInput",
7371
"CreateAccessTokenInput",
7472
"CreateAutoScalingRuleInput",
7573
"CreateDeploymentInput",
@@ -101,7 +99,6 @@
10199
"ResourceSlotEntryInput",
102100
"ResourceSlotInput",
103101
"RevisionFilter",
104-
"RevisionInput",
105102
"RevisionOrder",
106103
"ReplaceDeploymentOptionsGQLInput",
107104
"ReplaceDeploymentOptionsInput",
@@ -257,9 +254,6 @@ class ModelRuntimeConfigInput(BaseRequestModel):
257254
" RuntimeVariant resolver service before invoking internal flows."
258255
),
259256
)
260-
inference_runtime_config: dict[str, Any] | None = Field(
261-
default=None, description="Framework-specific inference runtime configuration"
262-
)
263257
environ: EnvironmentVariablesInput | None = Field(
264258
default=None, description="Environment variables for the service"
265259
)
@@ -295,10 +289,9 @@ class ExtraVFolderMountInput(BaseRequestModel):
295289
)
296290

297291

298-
class CreateRevisionInputDTO(BaseRequestModel):
292+
class CreateRevisionInput(BaseRequestModel):
299293
"""Input for a deployment revision (nested structure matching GQL CreateRevisionInput)."""
300294

301-
name: str | None = Field(default=None, description="Revision name")
302295
revision_preset_id: DeploymentPresetID | None = Field(
303296
default=None,
304297
description="DeploymentRevisionPreset ID. When specified, preset values are used as defaults and can be overridden by explicitly provided fields.",
@@ -330,19 +323,24 @@ class AddRevisionOptions(BaseRequestModel):
330323
)
331324

332325

333-
class AddRevisionGQLInputDTO(BaseRequestModel):
326+
class AddRevisionInput(BaseRequestModel):
334327
"""Input for adding a revision. Used by both GQL and REST v2 APIs."""
335328

336-
name: str | None = Field(default=None, description="Revision name")
337329
revision_preset_id: DeploymentPresetID | None = Field(
338330
default=None,
339331
description="DeploymentRevisionPreset ID. When specified, preset values are used as defaults and can be overridden by explicitly provided fields.",
340332
)
341333
deployment_id: UUID = Field(description="Deployment ID")
342-
cluster_config: ClusterConfigInput = Field(description="Cluster configuration")
343-
resource_config: ResourceConfigInput = Field(description="Resource configuration")
344-
image: ImageInput = Field(description="Container image")
345-
model_runtime_config: ModelRuntimeConfigInput = Field(description="Runtime configuration")
334+
cluster_config: ClusterConfigInput | None = Field(
335+
default=None, description="Cluster configuration"
336+
)
337+
resource_config: ResourceConfigInput | None = Field(
338+
default=None, description="Resource configuration"
339+
)
340+
image: ImageInput | None = Field(default=None, description="Container image")
341+
model_runtime_config: ModelRuntimeConfigInput | None = Field(
342+
default=None, description="Runtime configuration"
343+
)
346344
model_mount_config: ModelMountConfigInput = Field(description="Model mount configuration")
347345
model_definition: ModelDefinitionInput | None = Field(
348346
default=None,
@@ -447,40 +445,6 @@ class DeploymentStrategyInput(BaseRequestModel):
447445
)
448446

449447

450-
class RevisionInput(BaseRequestModel):
451-
"""Input for a deployment revision."""
452-
453-
name: str | None = Field(default=None, description="Revision name")
454-
revision_preset_id: DeploymentPresetID | None = Field(
455-
default=None,
456-
description="DeploymentRevisionPreset ID. When specified, preset values are used as defaults and can be overridden by explicitly provided fields.",
457-
)
458-
image_id: UUID = Field(description="Container image ID")
459-
cluster_mode: ClusterMode = Field(description="Cluster mode for the revision")
460-
cluster_size: int = Field(default=1, ge=1, description="Number of nodes in the cluster")
461-
resource_slots: Mapping[str, Any] = Field(description="Resource slot requirements")
462-
resource_opts: Mapping[str, Any] | None = Field(
463-
default=None, description="Optional resource options"
464-
)
465-
runtime_variant_id: RuntimeVariantID = Field(description="Runtime variant ID (UUID)")
466-
inference_runtime_config: dict[str, Any] | None = Field(
467-
default=None, description="Framework-specific inference runtime configuration"
468-
)
469-
model_vfolder_id: VFolderUUID = Field(description="Model VFolder ID")
470-
model_mount_destination: str = Field(
471-
default="/models", description="Mount destination for model vfolder"
472-
)
473-
model_definition_path: str = Field(description="Path to model definition file")
474-
model_definition: ModelDefinitionInput | None = Field(
475-
default=None,
476-
description="Model definition to override the default values generated by the server",
477-
)
478-
extra_mounts: list[ExtraVFolderMountInput] | None = Field(
479-
default=None, description="Additional vfolder mounts"
480-
)
481-
environ: Mapping[str, str] | None = Field(default=None, description="Environment variables")
482-
483-
484448
class CreateDeploymentInput(BaseRequestModel):
485449
"""Input for creating a deployment."""
486450

@@ -492,7 +456,7 @@ class CreateDeploymentInput(BaseRequestModel):
492456
description="Deployment strategy configuration"
493457
)
494458
replica_count: int = Field(ge=0, description="Number of replicas")
495-
initial_revision: CreateRevisionInputDTO | None = Field(
459+
initial_revision: CreateRevisionInput | None = Field(
496460
default=None,
497461
description="Initial revision configuration. If omitted, deployment is created without a revision and must be added later via add_revision.",
498462
)
@@ -546,13 +510,6 @@ class ScaleDeploymentInput(BaseRequestModel):
546510
replicas: int = Field(ge=0, description="Target replica count")
547511

548512

549-
class AddRevisionInput(BaseRequestModel):
550-
"""Input for adding a revision to a deployment."""
551-
552-
deployment_id: UUID = Field(description="Deployment ID")
553-
revision: RevisionInput = Field(description="Revision configuration")
554-
555-
556513
# ---------------------------------------------------------------------------
557514
# Filter types
558515
# ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)