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",