生成项目任务/chat任务软删|生成资源管控回收|生成资源token验签API预处理

This commit is contained in:
2026-06-01 11:10:09 +08:00
parent edef601f7c
commit dfbf51b5c0
26 changed files with 1296 additions and 63 deletions
+1
View File
@@ -22,6 +22,7 @@ async def _cleanup_urls():
.where(
GenerationRecord.video_url_expires_at.isnot(None),
GenerationRecord.video_url_expires_at < now,
GenerationRecord.deleted_at.is_(None),
)
.values(video_url_expires_at=None)
)
@@ -106,7 +106,10 @@ def _build_optimized_prompt_by_params(task: ChatGenerationTask) -> str:
async def _run(task_id: str):
async with async_session() as db:
result = await db.execute(select(ChatGenerationTask).where(ChatGenerationTask.id == task_id))
result = await db.execute(select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
))
task = result.scalar_one_or_none()
if not task or task.generation_mode != "chatapi_async":
@@ -230,7 +233,10 @@ async def _run(task_id: str):
except Exception:
pass
result = await db.execute(select(ChatGenerationTask).where(ChatGenerationTask.id == task_id))
result = await db.execute(select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
))
task = result.scalar_one_or_none()
if task:
@@ -8,6 +8,7 @@ from app.models.chat_generation_task import ChatGenerationTask
from app.services.error_codes import extract_error_message
from app.services.generation_download_service import download_generation_result
from app.services.generation_log_service import log_task_event
from app.services.resource_accounting_service import record_chat_task_generated_resource
from app.tasks.celery_app import celery_app
@@ -57,14 +58,22 @@ async def _reload_task(db, task_id: str) -> ChatGenerationTask | None:
- 继续访问旧 task 有概率触发异步懒加载异常。
"""
result = await db.execute(
select(ChatGenerationTask).where(ChatGenerationTask.id == task_id)
select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
)
)
return result.scalar_one_or_none()
async def _run(task_id: str):
async with async_session() as db:
result = await db.execute(select(ChatGenerationTask).where(ChatGenerationTask.id == task_id))
result = await db.execute(
select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
)
)
task = result.scalar_one_or_none()
if not task or task.generation_mode != "chatapi_async":
return
@@ -104,17 +113,28 @@ async def _run(task_id: str):
to_stage="downloading",
)
local_url = await download_generation_result(task)
downloaded = await download_generation_result(task)
if task.gen_type == "image":
task.image_url = local_url
task.image_url = downloaded.url
else:
task.video_url = local_url
task.video_url = downloaded.url
task.status = "completed"
task.pipeline_stage = "done"
task.generated_at = datetime.now(timezone.utc)
task.retry_count = 0
await record_chat_task_generated_resource(
db,
task,
resource_url=downloaded.url,
storage_path=downloaded.storage_path,
file_size_bytes=downloaded.file_size_bytes,
remote_url=task.remote_result_url,
generated_at=task.generated_at,
)
await db.commit()
await log_task_event(
@@ -122,6 +142,10 @@ async def _run(task_id: str):
event_type="DOWNLOAD_SUCCESS",
to_status="completed",
to_stage="done",
detail={
"resource_url": downloaded.url,
"file_size_bytes": downloaded.file_size_bytes,
},
)
except Exception as exc:
@@ -173,4 +197,4 @@ else:
def apply_async(self, *args, **kwargs):
raise RuntimeError("Celery is disabled")
download_generation_result_task = _DisabledTask()
download_generation_result_task = _DisabledTask()
@@ -38,14 +38,20 @@ async def _reload_task(db, task_id: str) -> ChatGenerationTask | None:
- 所以 poll/download 的异常分支统一 rollback 后重新 select。
"""
result = await db.execute(
select(ChatGenerationTask).where(ChatGenerationTask.id == task_id)
select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
)
)
return result.scalar_one_or_none()
async def _run(task_id: str):
async with async_session() as db:
result = await db.execute(select(ChatGenerationTask).where(ChatGenerationTask.id == task_id))
result = await db.execute(select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
))
task = result.scalar_one_or_none()
if not task or task.generation_mode != "chatapi_async":
return