From 898059dabea75f8f4ddd7386a738854808d7d5d3 Mon Sep 17 00:00:00 2001 From: wwwwwwwww <526125649@qq.com> Date: Thu, 28 May 2026 15:05:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=B9=E5=BA=94=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=8F=90=E4=BA=A4=E7=A7=AF=E5=88=86=E6=89=A3=E9=99=A4?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=92=8C=E8=A1=8C=E4=B8=9A=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=AF=B9=E5=BA=94skill?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video-gen-api/app/api/v1/credits.py | 43 +++++++++++++++++++++----- video-gen-api/app/api/v1/industries.py | 5 ++- video-gen-api/app/services/credits.py | 22 +++++++++++-- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/video-gen-api/app/api/v1/credits.py b/video-gen-api/app/api/v1/credits.py index 1ab1853d..d1fe383a 100644 --- a/video-gen-api/app/api/v1/credits.py +++ b/video-gen-api/app/api/v1/credits.py @@ -1,13 +1,15 @@ from fastapi import APIRouter, Depends from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select from app.dependencies import get_db, get_current_user from app.models.user import User from app.models.credit_ratio import CreditRatio +from app.models.video_engine import VideoEngine +from app.models.image_engine import ImageEngine from app.schemas.credit import CreditBalanceOut, CreditRecordOut from app.schemas.credit_ratio import CreditRatioOut from app.services.credits import get_records -from sqlalchemy import select router = APIRouter(prefix="/credits", tags=["credits"]) @@ -29,13 +31,40 @@ async def get_credit_ratios( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): - result = await db.execute(select(CreditRatio)) - ratios = result.scalars().all() + async def get_ratios_for_engine_type(gen_type: str, engine_ids: list): + for engine_id in engine_ids: + result = await db.execute( + select(CreditRatio) + .where(CreditRatio.gen_type == gen_type) + .where(CreditRatio.model_config_id == engine_id) + ) + ratios = result.scalars().all() + if ratios: + return [CreditRatioOut.model_validate(r) for r in ratios] + return [] + + video_engines_result = await db.execute( + select(VideoEngine.id) + .where(VideoEngine.is_active == True) + .order_by(VideoEngine.priority.desc()) + ) + video_engine_ids = video_engines_result.scalars().all() + + image_engines_result = await db.execute( + select(ImageEngine.id) + .where(ImageEngine.is_active == True) + .order_by(ImageEngine.priority.desc()) + ) + image_engine_ids = image_engines_result.scalars().all() grouped = {} - for ratio in ratios: - if ratio.gen_type not in grouped: - grouped[ratio.gen_type] = [] - grouped[ratio.gen_type].append(CreditRatioOut.model_validate(ratio)) + + video_ratios = await get_ratios_for_engine_type("video", video_engine_ids) + if video_ratios: + grouped["video"] = video_ratios + + image_ratios = await get_ratios_for_engine_type("image", image_engine_ids) + if image_ratios: + grouped["image"] = image_ratios return grouped diff --git a/video-gen-api/app/api/v1/industries.py b/video-gen-api/app/api/v1/industries.py index f85d433d..fa1f786f 100644 --- a/video-gen-api/app/api/v1/industries.py +++ b/video-gen-api/app/api/v1/industries.py @@ -30,7 +30,10 @@ async def list_active_industries( try: raw = json.loads(ind.skills) if isinstance(raw, list): - skills = raw if raw and isinstance(raw[0], dict) else [{"key": s, "label": s} for s in raw] + if raw and isinstance(raw[0], dict): + skills = [s for s in raw if s.get("type") != "skill"] + else: + skills = [{"key": s, "label": s} for s in raw] except (json.JSONDecodeError, TypeError): skills = [] items.append({ diff --git a/video-gen-api/app/services/credits.py b/video-gen-api/app/services/credits.py index 4904b786..99c8ee0a 100644 --- a/video-gen-api/app/services/credits.py +++ b/video-gen-api/app/services/credits.py @@ -6,6 +6,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.models.user import User from app.models.credit_record import CreditRecord from app.models.system_config import SystemConfig +from app.models.video_engine import VideoEngine +from app.models.image_engine import ImageEngine from app.models.credit_ratio import CreditRatio from app.utils.id_gen import generate_id from app.utils.exceptions import InsufficientCreditsError @@ -70,6 +72,14 @@ async def calc_video_credits( 2. gen_type=video + resolution 下 base_credits/per_second_credits 最高规则; 3. 原硬编码默认算法。 """ + # 如果engine_id为空,默认查询权重最高的视频引擎积分规则 + if not engine_id: + video_engines_result = await db.execute( + select(VideoEngine.id) + .where(VideoEngine.is_active == True) + .order_by(VideoEngine.priority.desc()) + ) + engine_id = video_engines_result.scalar_one_or_none() ratio = await _get_credit_ratio( db, gen_type="video", @@ -82,7 +92,7 @@ async def calc_video_credits( # Fallback base = 60.0 duration_cost = duration * 2.0 - multiplier = {"4K": 2.5, "1080p": 1.5, "720p": 1.0}.get(resolution, 1.0) + multiplier = {"480p": 1, "1080p": 2, "720p": 1.5}.get(resolution, 1.0) return round((base + duration_cost) * multiplier, 2) @@ -90,7 +100,7 @@ def calc_credits(duration: int, resolution: str) -> float: """Legacy: hardcoded credit calculation. Prefer calc_video_credits for new code.""" base = 60.0 duration_cost = duration * 2.0 - multiplier = {"4K": 2.5, "1080p": 1.5, "720p": 1.0}.get(resolution, 1.0) + multiplier = {"480p": 2.5, "1080p": 1.5, "720p": 1.0}.get(resolution, 1.0) return round((base + duration_cost) * multiplier, 2) @@ -106,6 +116,14 @@ async def calc_image_credits( 2. gen_type=image + image_size 下 base_credits/per_second_credits 最高规则; 3. 原硬编码默认算法。 """ + # 如果engine_id为空,默认查询权重最高的图片引擎积分规则 + if not engine_id: + image_engines_result = await db.execute( + select(ImageEngine.id) + .where(ImageEngine.is_active == True) + .order_by(ImageEngine.priority.desc()) + ) + engine_id = image_engines_result.scalar_one_or_none() ratio = await _get_credit_ratio( db, gen_type="image",