feat: AI生图功能丰富
This commit is contained in:
@@ -6,6 +6,8 @@ import logging
|
||||
import socket
|
||||
import uuid
|
||||
|
||||
import httpx
|
||||
|
||||
from config import get_settings
|
||||
from db import get_session_factory
|
||||
from models import ProductAsset
|
||||
@@ -23,6 +25,7 @@ from services.jobs import (
|
||||
)
|
||||
from services.prompts import build_context, build_prompt
|
||||
from services.prompts.common import requirements_block
|
||||
from services.prompts.single_edit import build_single_edit_prompt
|
||||
from services.storage import get_storage
|
||||
from services.suite_service import append_generated_asset
|
||||
from services.tasks import TaskImage
|
||||
@@ -31,6 +34,10 @@ from services.video_renderer import VideoRenderCancelled, render_slideshow
|
||||
|
||||
log = logging.getLogger("background.worker")
|
||||
|
||||
# 异步供应商任务已经持久化了 task id 后,轮询网络失败不能把任务判为失败。
|
||||
# 下一次轮询复用同一 task id,不会再次提交/计费。
|
||||
PROVIDER_POLL_RETRY_DELAY_SECONDS = 30
|
||||
|
||||
|
||||
def _worker_owner() -> str:
|
||||
return f"{socket.gethostname()}-{uuid.uuid4().hex[:10]}"
|
||||
@@ -191,7 +198,11 @@ async def process_item(claim: ClaimedItem) -> None:
|
||||
"pcore": "gpt-image-2",
|
||||
}.get(provider, settings.ark_image_model)
|
||||
try:
|
||||
refs = _refs_for_job(list(payload.get("ref_images") or []), job_item)
|
||||
single_edit = payload.get("single_edit")
|
||||
refs = (
|
||||
[image["url"] for image in payload.get("ref_images") or []]
|
||||
if single_edit else _refs_for_job(list(payload.get("ref_images") or []), job_item)
|
||||
)
|
||||
operation = payload.get("operation", "edit")
|
||||
target_size = _image_size(provider, claim.ratio, is_wan=provider == "tongyi" and model.lower().startswith("wan"), model=model)
|
||||
edit_mask: str | None = None
|
||||
@@ -207,12 +218,21 @@ async def process_item(claim: ClaimedItem) -> None:
|
||||
edit_mask = outpaint.mask_data_url
|
||||
else:
|
||||
context = build_context(payload.get("context") or {}, fallback_name="")
|
||||
prompt_extra = job_item.get("prompt_extra") or job_item
|
||||
prompt = build_prompt(
|
||||
provider, model, job_item.get("kind", "custom"), context, claim.style_set, claim.lang,
|
||||
extra=prompt_extra, style_prompt=payload.get("style_prompt"), requirements=payload.get("requirements"),
|
||||
requirements_exclusive=bool(payload.get("requirements_exclusive")),
|
||||
)
|
||||
if single_edit:
|
||||
prompt = build_single_edit_prompt(
|
||||
requirements=payload.get("requirements") or "", config=single_edit,
|
||||
context=context, style_set=claim.style_set,
|
||||
style_prompt=payload.get("style_prompt"), ratio=claim.ratio,
|
||||
is_size_chart=job_item.get("kind") == "size_chart",
|
||||
reference_count=len(refs) - 1,
|
||||
)
|
||||
else:
|
||||
prompt_extra = job_item.get("prompt_extra") or job_item
|
||||
prompt = build_prompt(
|
||||
provider, model, job_item.get("kind", "custom"), context, claim.style_set, claim.lang,
|
||||
extra=prompt_extra, style_prompt=payload.get("style_prompt"), requirements=payload.get("requirements"),
|
||||
requirements_exclusive=bool(payload.get("requirements_exclusive")),
|
||||
)
|
||||
is_wan = provider == "tongyi" and model.lower().startswith("wan")
|
||||
result = await advance_generation(
|
||||
provider, prompt, refs,
|
||||
@@ -274,6 +294,21 @@ async def process_item(claim: ClaimedItem) -> None:
|
||||
claim.item_id, result_url=result_url, source_url=source_url or None,
|
||||
watermark_config=watermark_config, generated_asset_id=asset_id,
|
||||
)
|
||||
except (httpx.TimeoutException, httpx.TransportError) as exc:
|
||||
if claim.provider_task_id and claim.provider_task_kind:
|
||||
log.warning(
|
||||
"供应商轮询网络暂时失败,%ds 后重试同一任务 %s:%s",
|
||||
PROVIDER_POLL_RETRY_DELAY_SECONDS, claim.provider_task_id, exc.__class__.__name__,
|
||||
)
|
||||
await mark_waiting_provider(
|
||||
claim.item_id,
|
||||
claim.provider_task_id,
|
||||
claim.provider_task_kind,
|
||||
delay_seconds=PROVIDER_POLL_RETRY_DELAY_SECONDS,
|
||||
)
|
||||
return
|
||||
log.exception("后台图片任务 %s/%s 网络请求失败", claim.job_id, claim.item_id)
|
||||
await mark_item_failed(claim.item_id, str(exc) or exc.__class__.__name__)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
log.exception("后台图片任务 %s/%s 执行失败", claim.job_id, claim.item_id)
|
||||
await mark_item_failed(claim.item_id, str(exc))
|
||||
|
||||
Reference in New Issue
Block a user