@@ -52,8 +52,10 @@ def _normalize_optional_str(value: str | None) -> str | None:
5252
5353
5454class ProviderAccountCreate (BaseModel ):
55+ model_config = {"extra" : "forbid" }
56+
5557 account_id : str | None = Field (default = None , min_length = 1 , description = "Provider tenant/organization identifier." )
56- provider_key : str = Field (min_length = 1 , description = "Deployment adapter routing key." )
58+ provider_key : str = Field (min_length = 1 , description = "Deployment provider key." )
5759 backend_url : str = Field (min_length = 1 , description = "Deployment provider backend URL." )
5860 api_key : str = Field (min_length = 1 , description = "Deployment provider API key." )
5961
@@ -73,8 +75,10 @@ def normalize_account_id(cls, value: str | None) -> str | None:
7375
7476
7577class ProviderAccountUpdate (BaseModel ):
78+ model_config = {"extra" : "forbid" }
79+
7680 account_id : str | None = Field (default = None , min_length = 1 , description = "Provider tenant/organization identifier." )
77- provider_key : str | None = Field (default = None , min_length = 1 , description = "Deployment adapter routing key." )
81+ provider_key : str | None = Field (default = None , min_length = 1 , description = "Deployment provider key." )
7882 backend_url : str | None = Field (default = None , min_length = 1 , description = "Deployment provider backend URL." )
7983 api_key : str | None = Field (default = None , min_length = 1 , description = "Deployment provider API key." )
8084
@@ -127,15 +131,11 @@ class DeploymentGetResponse(DeploymentSummary):
127131 description : str | None = None
128132
129133
130- class DeploymentListItem (BaseModel ):
131- id : str
134+ class DeploymentListItem (DeploymentSummary ):
135+ """Extended deployment summary with list-specific fields."""
136+
132137 resource_key : str
133- type : DeploymentType
134- name : str
135138 attached_count : int = Field (default = 0 , ge = 0 )
136- created_at : datetime | None = None
137- updated_at : datetime | None = None
138- provider_data : dict | None = None
139139
140140
141141class DeploymentListResponse (BaseModel ):
@@ -153,6 +153,30 @@ class ProviderAccountListResponse(BaseModel):
153153 total : int = Field (default = 0 , ge = 0 )
154154
155155
156+ class DeploymentCreateResponse (BaseModel ):
157+ """API response for deployment creation, wrapping service-layer fields."""
158+
159+ id : IdLike
160+ name : str
161+ description : str = ""
162+ type : DeploymentType | None = None
163+ provider_result : dict [str , Any ] | None = None
164+
165+
166+ class DeploymentUpdateResponse (BaseModel ):
167+ """API response for deployment update."""
168+
169+ id : IdLike
170+ provider_result : dict [str , Any ] | None = None
171+
172+
173+ class DeploymentStatusResponse (BaseModel ):
174+ """API response for deployment status/health."""
175+
176+ id : IdLike
177+ provider_data : dict [str , Any ] | None = None
178+
179+
156180class RedeployResponse (DeploymentOperationResult ):
157181 pass
158182
@@ -164,6 +188,8 @@ class DeploymentDuplicateResponse(DeploymentSummary):
164188class DeploymentDuplicateParams (BaseModel ):
165189 """Parameters for duplicating a deployment."""
166190
191+ model_config = {"extra" : "forbid" }
192+
167193 deployment_type : DeploymentType
168194
169195
@@ -191,6 +217,8 @@ def validate_ids(cls, values: list[str]) -> list[str]:
191217class FlowVersionsPatch (BaseModel ):
192218 """Add or remove flow version bindings on an existing deployment."""
193219
220+ model_config = {"extra" : "forbid" }
221+
194222 add : list [str ] | None = Field (
195223 None ,
196224 description = "Flow version ids to attach to the deployment. Omit to leave unchanged." ,
@@ -211,6 +239,11 @@ def validate_id_lists(cls, values: list[str] | None) -> list[str] | None:
211239 def validate_operations (self ):
212240 add_values = self .add or []
213241 remove_values = self .remove or []
242+
243+ if not add_values and not remove_values :
244+ msg = "At least one of 'add' or 'remove' must be provided."
245+ raise ValueError (msg )
246+
214247 overlap = set (add_values ).intersection (remove_values )
215248 if overlap :
216249 ids = ", " .join (sorted (overlap ))
@@ -225,26 +258,37 @@ def validate_operations(self):
225258
226259
227260class DeploymentCreateRequest (BaseModel ):
228- provider_id : UUID = Field (description = "Deployment provider account id for adapter routing." )
229- spec : BaseDeploymentData = Field (description = "The base metadata of the deployment." )
261+ model_config = {"extra" : "forbid" }
262+
263+ provider_id : UUID = Field (description = "Deployment provider account id." )
264+ spec : BaseDeploymentData = Field (description = "Deployment metadata." )
230265 project_id : UUID | None = Field (
231266 default = None ,
232267 description = "Langflow Project id to persist the deployment under. Defaults to user's Starter Project." ,
233268 )
234- flow_versions : FlowVersionsAttach | None = Field (
269+ flow_version_ids : FlowVersionsAttach | None = Field (
235270 default = None ,
236- description = "Flow version ids used to build provider snapshots during deployment creation ." ,
271+ description = "Flow version ids to attach to the deployment." ,
237272 )
238- config : ConfigItem | None = Field (default = None , description = "Deployment config binding/create payload ." )
273+ config : ConfigItem | None = Field (default = None , description = "Deployment configuration ." )
239274
240275
241276class DeploymentUpdateRequest (BaseModel ):
277+ model_config = {"extra" : "forbid" }
278+
242279 spec : BaseDeploymentDataUpdate | None = Field (default = None , description = "Deployment metadata updates." )
243- flow_versions : FlowVersionsPatch | None = Field (
280+ flow_version_ids : FlowVersionsPatch | None = Field (
244281 default = None ,
245- description = "Flow version attach/detach patch payload ." ,
282+ description = "Flow version attach/detach operations ." ,
246283 )
247- config : ConfigDeploymentBindingUpdate | None = Field (default = None , description = "Deployment config binding patch." )
284+ config : ConfigDeploymentBindingUpdate | None = Field (default = None , description = "Deployment configuration update." )
285+
286+ @model_validator (mode = "after" )
287+ def ensure_any_field_provided (self ) -> DeploymentUpdateRequest :
288+ if self .spec is None and self .flow_version_ids is None and self .config is None :
289+ msg = "At least one of 'spec', 'flow_version_ids', or 'config' must be provided."
290+ raise ValueError (msg )
291+ return self
248292
249293
250294# ---------------------------------------------------------------------------
@@ -253,21 +297,18 @@ class DeploymentUpdateRequest(BaseModel):
253297
254298
255299class ExecutionCreateRequest (BaseModel ):
256- provider_id : UUID = Field (description = "Deployment provider account id for adapter routing." )
300+ model_config = {"extra" : "forbid" }
301+
302+ provider_id : UUID = Field (description = "Deployment provider account id." )
257303 deployment_id : IdLike
258- deployment_type : DeploymentType
259- input : str | dict [str , Any ] | None = None
260304 provider_input : dict [str , Any ] | None = None
261305
262306
263307class _ExecutionResponseBase (BaseModel ):
264308 """Shared fields for execution responses."""
265309
266- execution_id : str | None = None
310+ execution_id : str
267311 deployment_id : IdLike
268- deployment_type : DeploymentType | None = None
269- status : str | None = None
270- output : str | dict [str , Any ] | None = None
271312 provider_result : dict [str , Any ] | None = None
272313
273314
0 commit comments