Преглед изворни кода

feat: 创建模型时处理软删除记录冲突

- 在 ModelCreate schema 中添加 overwrite_deleted 参数
- 创建模型时检查是否存在同名软删除记录
- 如果存在软删除记录且 overwrite_deleted=false,返回提示让用户确认
- 用户确认后设置 overwrite_deleted=true 重新提交,永久删除旧记录并创建新模型
- 修复 'duplicate key value violates unique constraint ix_models_name' 错误

用户流程:
1. 首次创建已删除的同名模型时,返回错误提示:'Model xxx was previously deleted. Do you want to overwrite it?'
2. 前端显示确认对话框
3. 用户确认后,前端带上 overwrite_deleted=true 重新提交请求
4. 后端永久删除软删除记录并创建新模型
kinglee пре 2 дана
родитељ
комит
a6458ce4a4
2 измењених фајлова са 13 додато и 2 уклоњено
  1. 9 2
      gpustack/routes/models.py
  2. 4 0
      gpustack/schemas/models.py

+ 9 - 2
gpustack/routes/models.py

@@ -432,7 +432,14 @@ async def create_model(
 
     if any_existing:
         if any_existing.deleted_at is not None:
-            # Soft-deleted record found - permanently delete it to free up the name
+            # Soft-deleted record found
+            if not model_in.overwrite_deleted:
+                # Prompt user to confirm overwrite
+                raise AlreadyExistsException(
+                    message=f"Model '{model_in.name}' was previously deleted. "
+                    "Do you want to overwrite it? Set 'overwrite_deleted=true' to confirm."
+                )
+            # User confirmed overwrite - permanently delete the soft-deleted record
             await session.delete(any_existing)
             await session.flush()
         else:
@@ -473,7 +480,7 @@ async def create_model(
                 "Please choose a different name or check the existing model route."
             )
     await validate_model_in(session, model_in)
-    model_in_dict = model_in.model_dump(exclude={"enable_model_route"})
+    model_in_dict = model_in.model_dump(exclude={"enable_model_route", "overwrite_deleted"})
 
     # Stamp tenant scope. ModelBase has owner_principal_id defaulted to
     # PLATFORM_PRINCIPAL_ID, so `model_dump()` always emits the key —

+ 4 - 0
gpustack/schemas/models.py

@@ -305,6 +305,10 @@ class ModelListParams(ListParams):
 
 class ModelCreate(ModelBase):
     enable_model_route: Optional[bool] = Field(default=None)
+    overwrite_deleted: bool = Field(
+        default=False,
+        description="When true, overwrite soft-deleted model with the same name"
+    )
 
 
 class ModelUpdate(ModelBase):