Files
video-gen/video-gen-api/app/services/generation/pipeline/enqueue_service.py
T

70 lines
2.7 KiB
Python

from __future__ import annotations
from app.enums.celery_queue import CeleryQueue
from app.enums.generation_task import ChatGenerationTaskEventType
from app.services.generation.log_service import log_task_event
from app.services.generation.pipeline.owner_service import GenerationOwner, owner_type_of
async def enqueue_generation_create(
owner: GenerationOwner | None = None,
*,
reason: str,
owner_type: str | None = None,
owner_id: str | None = None,
generation_attempt_no: int | None = None,
generation_mode: str | None = None,
) -> None:
"""Commit caller-owned state before invoking this function.
Scalar owner fields are accepted so callers can avoid touching an ORM object after
commit. Existing callers may continue passing ``owner``.
"""
from app.tasks.generation_create_tasks import chatapi_create_generation_task
resolved_owner_type = owner_type or (owner_type_of(owner) if owner is not None else None)
resolved_owner_id = owner_id or (str(owner.id) if owner is not None else None)
resolved_attempt_no = int(
generation_attempt_no
or (getattr(owner, "generation_attempt_no", 1) if owner is not None else 1)
or 1
)
if not resolved_owner_type or not resolved_owner_id:
raise ValueError("投递生成任务缺少 owner_type 或 owner_id")
try:
chatapi_create_generation_task.apply_async(
args=[resolved_owner_id],
kwargs={
"owner_type": resolved_owner_type,
"generation_attempt_no": resolved_attempt_no,
},
queue=CeleryQueue.GEN_CHATAPI_CREATE.value,
task_id=(
f"generation-create:{resolved_owner_type}:{resolved_owner_id}:"
f"attempt:{resolved_attempt_no}"
),
)
await log_task_event(
owner,
owner_type=resolved_owner_type,
owner_id=resolved_owner_id,
generation_attempt_no=resolved_attempt_no,
generation_mode=generation_mode,
event_type=ChatGenerationTaskEventType.GENERATION_RECORD_ENQUEUE_SUCCESS.value,
message="资源生成创建任务已投递",
detail={"reason": reason, "queue": CeleryQueue.GEN_CHATAPI_CREATE.value},
)
except Exception as exc:
await log_task_event(
owner,
owner_type=resolved_owner_type,
owner_id=resolved_owner_id,
generation_attempt_no=resolved_attempt_no,
generation_mode=generation_mode,
event_type=ChatGenerationTaskEventType.GENERATION_RECORD_ENQUEUE_FAILED.value,
message=str(exc),
detail={"reason": reason, "queue": CeleryQueue.GEN_CHATAPI_CREATE.value},
)
raise