From 75b1665f762bd51768010d5ad5eb0f9867c68372 Mon Sep 17 00:00:00 2001 From: "Azmat@qq.com" Date: Fri, 4 Sep 2026 18:30:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=BB=B6=E6=88=90=E7=89=87=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E8=AE=A1=E7=AE=97=E8=A1=A5=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/backend/apps/projects/services/quick_create.py | 6 ++++-- core/frontend/src/routes/quick-create.tsx | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/backend/apps/projects/services/quick_create.py b/core/backend/apps/projects/services/quick_create.py index 794df01..ed77bbe 100644 --- a/core/backend/apps/projects/services/quick_create.py +++ b/core/backend/apps/projects/services/quick_create.py @@ -113,14 +113,16 @@ def estimate_quick_create_points( resolution: str, total_duration: int, ): - """与前端按钮预估同口径:脚本挂牌 + 默认出图×场次 + 视频挂牌秒价×时长(无引用视频)。""" + """与前端按钮预估同口径:脚本挂牌 + 出图粗估(1商品+每场1角色+1场景) + 视频挂牌秒价×时长(无引用视频)。""" from decimal import Decimal from apps.billing.pricing import quote_flat, quote_video_estimate scene_count = max(1, int(total_duration) // 15) + # 与 _ensure_fallback_entities / _specs_from_entities 下限对齐:商品1 + 角色1×场 + 场景1×场 + image_count = 1 + scene_count * 2 script_points = quote_flat(text_model, units=1, team=team).points - image_points = quote_flat(image_model, units=scene_count, team=team).points + image_points = quote_flat(image_model, units=image_count, team=team).points _tokens, video_quote = quote_video_estimate( video_model, aspect_ratio=aspect_ratio, diff --git a/core/frontend/src/routes/quick-create.tsx b/core/frontend/src/routes/quick-create.tsx index 1c19bf6..1716af6 100644 --- a/core/frontend/src/routes/quick-create.tsx +++ b/core/frontend/src/routes/quick-create.tsx @@ -597,7 +597,7 @@ export function QuickCreatePage({ { ratio: aspectRatio, resolution, duration: totalDuration, refs: [] }, billingRates, ); - // 与实扣对齐:脚本(Seed 2.1 Pro 挂牌) + 默认出图挂牌×场次粗估 + 视频挂牌秒价×时长 + // 与实扣对齐:脚本挂牌 + 出图粗估(1商品+每场1角色+1场景) + 视频挂牌秒价×时长 const applyTeam = (raw: number) => { const multiplier = billingRates.multiplier || 1; if (!(raw > 0)) return 0; @@ -619,8 +619,10 @@ export function QuickCreatePage({ const listed = pointsPerImageFromCatalog(img); return listed != null && listed > 0 ? listed : QUICK_IMAGE_POINTS_FALLBACK; })(); + // 脚本未出前粗估:1 张商品图 + 每场至少 1 角色图 + 1 场景图(与 _ensure_fallback_entities 兜底一致) + const estimatedAssetCount = 1 + sceneCount * 2; const estimatedPoints = videoEstimate.listed - ? videoEstimate.points + applyTeam(scriptUnit) + applyTeam(sceneCount * imageUnit) + ? videoEstimate.points + applyTeam(scriptUnit) + applyTeam(estimatedAssetCount * imageUnit) : 0; const shellClass = [ "quick-create-shell",