生成任务失败积分回退

This commit is contained in:
2026-06-03 16:15:45 +08:00
parent 7c56c02135
commit 1079a5a7d1
14 changed files with 931 additions and 259 deletions
@@ -9,6 +9,7 @@ from app.models.base import async_session
from app.models.chat_generation_task import ChatGenerationTask
from app.services.error_codes import extract_error_message
from app.services.generation_log_service import log_task_event
from app.services.generation_refund_service import mark_chat_generation_task_failed_and_refund_once
from app.services.generation_provider_service import create_provider_task
from app.tasks.celery_app import celery_app
@@ -109,7 +110,7 @@ async def _run(task_id: str):
result = await db.execute(select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
).limit(1))
).with_for_update().limit(1))
task = result.scalar_one_or_none()
if not task or task.generation_mode != "chatapi_async":
@@ -119,9 +120,12 @@ async def _run(task_id: str):
return
if task.deadline_at and datetime.now(timezone.utc) > task.deadline_at:
task.status = "failed"
task.pipeline_stage = "timeout"
task.error_message = "任务超时"
await mark_chat_generation_task_failed_and_refund_once(
db,
task=task,
error_message="任务超时",
pipeline_stage="timeout",
)
await db.commit()
await log_task_event(task, event_type="TASK_TIMEOUT", to_status="failed", to_stage="timeout")
return
@@ -236,12 +240,17 @@ async def _run(task_id: str):
result = await db.execute(select(ChatGenerationTask).where(
ChatGenerationTask.id == task_id,
ChatGenerationTask.deleted_at.is_(None),
).limit(1))
).with_for_update().limit(1))
task = result.scalar_one_or_none()
if task:
task.status = "failed"
task.error_message = extract_error_message(exc, "生成任务") if callable(extract_error_message) else str(exc)
error_message = extract_error_message(exc, "生成任务") if callable(extract_error_message) else str(exc)
await mark_chat_generation_task_failed_and_refund_once(
db,
task=task,
error_message=error_message,
pipeline_stage="failed",
)
await db.commit()
await log_task_event(task, event_type="TASK_FAILED", message=task.error_message)