From 0f5b338a93b7c9e09eaea0bc6a9cabd05429c418 Mon Sep 17 00:00:00 2001 From: chengkai3 Date: Fri, 12 Jun 2026 23:35:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:[FL-99][=E4=BF=AE=E5=A4=8DATP=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=B8=8D=E5=8C=B9=E9=85=8D=E5=AF=BC=E8=87=B4?= =?UTF-8?q?500=E9=94=99=E8=AF=AF]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:POST /api/v1/atp/assets/{asset_id}/releases/upload 接口声明 response_model=AtpAssetReleaseDetail,但实际返回 {task_id, status} 字典, 导致FastAPI响应验证失败,返回500错误。 解决方案: 1. 新增 AtpAssetReleaseUploadResponse 响应模型,包含 task_id 和 status 字段 2. 更新接口声明使用正确的响应模型 3. 返回类型注解改为 AtpAssetReleaseUploadResponse Co-Authored-By: Claude Sonnet 4.6 Co-authored-by: multica-agent --- api/app/api/v1/atp_assets.py | 7 ++++--- api/app/schemas/atp_asset.py | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/api/app/api/v1/atp_assets.py b/api/app/api/v1/atp_assets.py index 4c02f20..1807a5d 100644 --- a/api/app/api/v1/atp_assets.py +++ b/api/app/api/v1/atp_assets.py @@ -14,6 +14,7 @@ from ...schemas.atp_asset import ( AtpAssetReleaseDetail, AtpAssetReleaseListResponse, AtpAssetReleaseUpdateRequest, + AtpAssetReleaseUploadResponse, AtpAssetRunDetail, AtpAssetRunListResponse, AtpAssetRunRequest, @@ -152,14 +153,14 @@ def create_atp_asset_release_endpoint( return create_release(db, asset_id=asset_id, payload=payload, actor_user_id=current_user.user.id) -@router.post("/assets/{asset_id}/releases/upload", response_model=AtpAssetReleaseDetail) +@router.post("/assets/{asset_id}/releases/upload", response_model=AtpAssetReleaseUploadResponse) def upload_atp_asset_release_endpoint( asset_id: str, release_tag: str | None = Form(default=None), archive: UploadFile = File(...), current_user: CurrentUser = Depends(require_permission("atp.manage")), db: Session = Depends(get_db), -) -> dict: +) -> AtpAssetReleaseUploadResponse: from ...tasks.atp_asset_tasks import process_release_archive_upload_task try: @@ -178,7 +179,7 @@ def upload_atp_asset_release_endpoint( actor_user_id=current_user.user.id, ) - return {"task_id": task.id, "status": "processing"} + return AtpAssetReleaseUploadResponse(task_id=task.id, status="processing") @router.get("/releases", response_model=AtpAssetReleaseListResponse) diff --git a/api/app/schemas/atp_asset.py b/api/app/schemas/atp_asset.py index a8e34fd..8913b1d 100644 --- a/api/app/schemas/atp_asset.py +++ b/api/app/schemas/atp_asset.py @@ -204,3 +204,8 @@ class AtpAssetRunRequest(BaseModel): extra_args: list[str] = Field(default_factory=list, max_length=32) environment: dict[str, str] = Field(default_factory=dict, max_length=16) dry_run: bool = False + + +class AtpAssetReleaseUploadResponse(BaseModel): + task_id: str + status: str