feat: 试用过程中的细节优化
This commit is contained in:
@@ -10,7 +10,7 @@ from config import get_settings
|
||||
from db import get_session_factory
|
||||
from models import ProductAsset
|
||||
from services.image_assets import get_image_asset_service
|
||||
from services.generator import _image_size, _refs_for_job, advance_generation
|
||||
from services.generator import OutpaintCanvas, _image_size, _refs_for_job, advance_generation, prepare_outpaint_canvas
|
||||
from services.jobs import (
|
||||
ClaimedItem,
|
||||
claim_next_item,
|
||||
@@ -22,6 +22,7 @@ from services.jobs import (
|
||||
recover_expired_leases,
|
||||
)
|
||||
from services.prompts import build_context, build_prompt
|
||||
from services.prompts.common import requirements_block
|
||||
from services.storage import get_storage
|
||||
from services.suite_service import append_generated_asset
|
||||
from services.tasks import TaskImage
|
||||
@@ -152,6 +153,22 @@ async def _process_slideshow_video_item(claim: ClaimedItem) -> None:
|
||||
await mark_item_failed(claim.item_id, str(exc))
|
||||
|
||||
|
||||
def _outpaint_prompt(requirements: str | None) -> str:
|
||||
"""仅扩图不复用套图提示词,避免默认风格、营销构图或文字污染边缘生成。"""
|
||||
requested = (requirements or "").strip()
|
||||
if not requested:
|
||||
requested = "Continue the existing surroundings naturally and seamlessly."
|
||||
return "\n\n".join([
|
||||
requirements_block(requested),
|
||||
"OUTPAINT ONLY: Image 1 contains an original photo placed on a 3:4 canvas. Generate pixels only "
|
||||
"in the transparent masked margins outside the original photo. Do not crop, move, resize, redraw, "
|
||||
"retouch, recolor, relight, or otherwise alter any pixel of the original photo.",
|
||||
"Do not add marketing layouts, product captions, overlays, props, or visible text unless the STRICT "
|
||||
"REQUIREMENTS explicitly ask for them. Make the new margins blend naturally with the original edges.",
|
||||
"FINAL CHECK: output exactly 3:4 and change only the newly expanded margins.",
|
||||
])
|
||||
|
||||
|
||||
async def process_item(claim: ClaimedItem) -> None:
|
||||
"""推进一次子任务。外部模型未完成时只写 provider id 并退出,让出 Worker。"""
|
||||
if claim.job_kind == "watermark_batch":
|
||||
@@ -174,18 +191,34 @@ async def process_item(claim: ClaimedItem) -> None:
|
||||
"pcore": "gpt-image-2",
|
||||
}.get(provider, settings.ark_image_model)
|
||||
try:
|
||||
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"),
|
||||
)
|
||||
refs = _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
|
||||
outpaint: OutpaintCanvas | None = None
|
||||
if operation == "outpaint":
|
||||
if len(refs) != 1:
|
||||
raise RuntimeError("仅扩图必须且只能使用一张参考底图")
|
||||
prompt = _outpaint_prompt(payload.get("requirements"))
|
||||
# 首次提交时才构造图片和蒙版;之后轮询不再向供应商重复上传。
|
||||
if not claim.provider_task_id:
|
||||
outpaint = await prepare_outpaint_canvas(refs[0], target_size)
|
||||
refs = [outpaint.image_data_url]
|
||||
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")),
|
||||
)
|
||||
is_wan = provider == "tongyi" and model.lower().startswith("wan")
|
||||
result = await advance_generation(
|
||||
provider, prompt, refs,
|
||||
size=_image_size(provider, claim.ratio, is_wan=is_wan, model=model), model=model,
|
||||
size=target_size, model=model,
|
||||
provider_task_id=claim.provider_task_id, provider_task_kind=claim.provider_task_kind,
|
||||
edit_mask=edit_mask,
|
||||
)
|
||||
if result.data is None:
|
||||
if not result.provider_task_id or not result.provider_task_kind:
|
||||
@@ -203,6 +236,11 @@ async def process_item(claim: ClaimedItem) -> None:
|
||||
await mark_item_cancelled(claim.item_id)
|
||||
return
|
||||
|
||||
if operation == "outpaint":
|
||||
# 异步任务完成时本轮未必创建过画布,按同一源图与尺寸确定性重建后覆盖原图区域。
|
||||
outpaint = outpaint or await prepare_outpaint_canvas(refs[0], target_size)
|
||||
result = type(result)(data=outpaint.restore_original(result.data))
|
||||
|
||||
watermark = payload.get("watermark") or {}
|
||||
position = int(job_item.get("position", 0))
|
||||
if watermark.get("enabled"):
|
||||
|
||||
Reference in New Issue
Block a user