chore: 修复black/isort格式
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Failing after 19s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m11s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 24s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m30s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Failing after 19s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m11s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 24s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m30s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
This commit is contained in:
@@ -39,7 +39,9 @@ class CreateGenerationTaskRequest(BaseModel):
|
||||
description="是否开启失败自动重试,默认关闭",
|
||||
)
|
||||
auto_retry_max: int = Field(
|
||||
default=0, ge=0, le=5,
|
||||
default=0,
|
||||
ge=0,
|
||||
le=5,
|
||||
description="最大自动重试次数,0表示不自动重试,最大5次",
|
||||
)
|
||||
|
||||
|
||||
@@ -1197,10 +1197,12 @@ def generate_video(self, task_id: str) -> dict:
|
||||
if current_retry < _task.auto_retry_max:
|
||||
logger.info(
|
||||
"[task_id=%s] 触发自动重试: 当前重试次数=%d, 最大重试次数=%d",
|
||||
task_id, current_retry, _task.auto_retry_max,
|
||||
task_id,
|
||||
current_retry,
|
||||
_task.auto_retry_max,
|
||||
)
|
||||
# 计算退避延迟(指数退避,基础5s,最大60s)
|
||||
backoff_seconds = min(5 * (2 ** current_retry), 60)
|
||||
backoff_seconds = min(5 * (2**current_retry), 60)
|
||||
# 原地重试
|
||||
_task.mark_pending_from_failed()
|
||||
_r.update(_task)
|
||||
@@ -1212,14 +1214,18 @@ def generate_video(self, task_id: str) -> dict:
|
||||
)
|
||||
logger.info(
|
||||
"[task_id=%s] 自动重试已入队: 延迟=%ds, 第%d次重试",
|
||||
task_id, backoff_seconds, current_retry + 1,
|
||||
task_id,
|
||||
backoff_seconds,
|
||||
current_retry + 1,
|
||||
)
|
||||
finally:
|
||||
_s.close()
|
||||
except Exception as retry_err:
|
||||
logger.warning(
|
||||
"[task_id=%s] 自动重试逻辑执行失败: %s",
|
||||
task_id, retry_err, exc_info=True,
|
||||
task_id,
|
||||
retry_err,
|
||||
exc_info=True,
|
||||
)
|
||||
|
||||
return {
|
||||
|
||||
@@ -144,9 +144,7 @@ class SQLAlchemyGenerationTaskRepository:
|
||||
offset: int = 0,
|
||||
) -> list[GenerationTask]:
|
||||
"""按用户+状态筛选任务列表。"""
|
||||
query = self.session.query(GenerationTaskModel).filter(
|
||||
GenerationTaskModel.created_by_user_id == user_id
|
||||
)
|
||||
query = self.session.query(GenerationTaskModel).filter(GenerationTaskModel.created_by_user_id == user_id)
|
||||
if status:
|
||||
query = query.filter(GenerationTaskModel.status == status)
|
||||
query = query.order_by(GenerationTaskModel.created_at.desc())
|
||||
@@ -163,9 +161,7 @@ class SQLAlchemyGenerationTaskRepository:
|
||||
status: str | None = None,
|
||||
) -> int:
|
||||
"""按用户+状态筛选计数。"""
|
||||
query = self.session.query(GenerationTaskModel).filter(
|
||||
GenerationTaskModel.created_by_user_id == user_id
|
||||
)
|
||||
query = self.session.query(GenerationTaskModel).filter(GenerationTaskModel.created_by_user_id == user_id)
|
||||
if status:
|
||||
query = query.filter(GenerationTaskModel.status == status)
|
||||
return query.count()
|
||||
@@ -179,9 +175,7 @@ class SQLAlchemyGenerationTaskRepository:
|
||||
offset: int = 0,
|
||||
) -> list[GenerationTask]:
|
||||
"""按项目+状态筛选任务列表。"""
|
||||
query = self.session.query(GenerationTaskModel).filter(
|
||||
GenerationTaskModel.project_id == project_id
|
||||
)
|
||||
query = self.session.query(GenerationTaskModel).filter(GenerationTaskModel.project_id == project_id)
|
||||
if status:
|
||||
query = query.filter(GenerationTaskModel.status == status)
|
||||
query = query.order_by(GenerationTaskModel.created_at.desc())
|
||||
@@ -198,9 +192,7 @@ class SQLAlchemyGenerationTaskRepository:
|
||||
status: str | None = None,
|
||||
) -> int:
|
||||
"""按项目+状态筛选计数。"""
|
||||
query = self.session.query(GenerationTaskModel).filter(
|
||||
GenerationTaskModel.project_id == project_id
|
||||
)
|
||||
query = self.session.query(GenerationTaskModel).filter(GenerationTaskModel.project_id == project_id)
|
||||
if status:
|
||||
query = query.filter(GenerationTaskModel.status == status)
|
||||
return query.count()
|
||||
|
||||
@@ -65,12 +65,14 @@ class GetGenerationTaskUseCase:
|
||||
@dataclass(slots=True)
|
||||
class ListTasksFilter:
|
||||
"""任务列表筛选条件。"""
|
||||
|
||||
status: str | None = None # pending, running, completed, failed, cancelled
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class ListGenerationTasksResult:
|
||||
"""带筛选和分页的任务列表结果。"""
|
||||
|
||||
items: list[GenerationTask]
|
||||
total: int
|
||||
|
||||
|
||||
Reference in New Issue
Block a user