This commit is contained in:
2026-07-10 17:09:14 +08:00
parent ad2e40bc67
commit d07cd508ee
54 changed files with 7111 additions and 619 deletions
@@ -15,6 +15,7 @@ from app.enums.generation_task import (
GenerationMode,
GenerationType,
)
from app.enums.model_pricing import PricingSnapshotStage, ProviderCostStatus
from app.models.base import async_session
from app.models.chat_generation_task import ChatGenerationTask
from app.services.error_codes import extract_error_message
@@ -22,7 +23,11 @@ from app.services.generation_log_service import log_task_event
from app.services.generation_poll_schedule_service import ensure_video_poll_fields
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.services.media_token_usage_snapshot_service import sync_chat_generation_task_media_token_snapshot
from app.services.image_gen import is_sync_image_provider_result_uncertain
from app.services.media_token_usage_snapshot_service import (
mark_media_provider_cost_status,
sync_chat_generation_task_media_token_snapshot,
)
from app.services.redis_registry_service import ensure_aware_utc
from app.tasks.celery_app import celery_app
@@ -171,6 +176,8 @@ async def _run(task_id: str):
):
return
provider_call_started = False
provider_call_completed = False
try:
if not task.optimized_prompt:
old_stage = task.pipeline_stage
@@ -229,7 +236,9 @@ async def _run(task_id: str):
to_stage=ChatGenerationPipelineStage.CREATING_PROVIDER_TASK.value,
)
provider_call_started = True
created = await create_provider_task(db, task)
provider_call_completed = True
provider_task_id = created.get("task_id")
if provider_task_id:
@@ -246,7 +255,13 @@ async def _run(task_id: str):
ensure_ascii=False,
default=str,
)
await sync_chat_generation_task_media_token_snapshot(db, task, provider_response=task.provider_response_json)
if task.gen_type == GenerationType.IMAGE.value:
await sync_chat_generation_task_media_token_snapshot(
db,
task,
provider_response=task.provider_response_json,
stage=PricingSnapshotStage.PROVIDER_SYNC_COMPLETED.value,
)
if task.remote_result_url and not task.seedance_task_id:
# 同步图片路径:原 SDK 已经返回最终 URL。
@@ -302,6 +317,19 @@ async def _run(task_id: str):
if task:
error_message = extract_error_message(exc, "生成任务") if callable(extract_error_message) else str(exc)
if task.gen_type == GenerationType.IMAGE.value and provider_call_started:
uncertain = provider_call_completed or is_sync_image_provider_result_uncertain(exc)
await mark_media_provider_cost_status(
db,
owner=task,
status=(
ProviderCostStatus.PROVIDER_RESULT_UNCERTAIN.value
if uncertain
else ProviderCostStatus.NOT_INCURRED.value
),
reason=error_message,
usage_stage="provider_sync_exception",
)
await mark_chat_generation_task_failed_and_refund_once(
db,
task=task,