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