From 225c6548117b3bd436e0e514ea1255afe2355375 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 6 Jul 2026 17:20:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=A8=A1=E5=9E=8B=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=AE=A2=E6=88=B7=E9=80=89=E9=A1=B9+?= =?UTF-8?q?=E5=AE=9A=E4=BB=B7=E6=94=B9=E4=B8=BAllmage=E6=A8=A1=E5=9E=8B(wa?= =?UTF-8?q?n2.6/happyhorse/kling)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/cost_estimator.py | 40 ++++++++++++++++++++-------------------- app/ktv_adapter.py | 22 ++++++++++------------ 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/app/cost_estimator.py b/app/cost_estimator.py index 71cb6ab..fd95a53 100644 --- a/app/cost_estimator.py +++ b/app/cost_estimator.py @@ -19,33 +19,33 @@ from typing import List, Dict, Any logger = logging.getLogger("pipeline.cost_estimator") -# Model pricing configuration (USD per frame at 24fps) +# Model pricing configuration — llmage v1 video models MODEL_PRICING = { - "wan2.2": { - "name": "Wan 2.2 (Local GPU)", - "price_per_frame": 0.002, # $0.002 per frame - "quality_score": 7.5, - "generation_speed": "fast", - "description": "Fast generation, good quality, cost-effective", - "features": ["T2V", "Ref2V"], - "recommended_for": ["standard", "batch"], - }, - "wan2.7": { - "name": "Wan 2.7 (Local GPU)", - "price_per_frame": 0.003, # $0.003 per frame + "wan2.6-t2v": { + "name": "通义万象 WAN 2.6 (T2V)", + "price_per_second": 0.05, "quality_score": 8.5, "generation_speed": "medium", - "description": "Higher quality, balanced performance", - "features": ["T2V", "Ref2V", "I2V"], + "description": "高质量文生视频,支持5-15秒", + "features": ["T2V"], "recommended_for": ["quality", "professional"], }, - "vidu2.0": { - "name": "Vidu 2.0 (Cloud API)", - "price_per_frame": 0.008, # $0.008 per frame + "happyhorse-1.0-t2v": { + "name": "快乐马 HappyHorse 1.0 (T2V)", + "price_per_second": 0.03, + "quality_score": 7.5, + "generation_speed": "fast", + "description": "快速文生视频,经济实惠", + "features": ["T2V", "I2V"], + "recommended_for": ["standard", "batch"], + }, + "kling-v2-1-master": { + "name": "可灵 Kling 2.1 Master (T2V)", + "price_per_second": 0.10, "quality_score": 9.0, "generation_speed": "slow", - "description": "Highest quality, premium pricing", - "features": ["T2V", "I2V", "V2V"], + "description": "旗舰级文生视频,最高质量", + "features": ["T2V", "I2V"], "recommended_for": ["premium", "cinematic"], }, } diff --git a/app/ktv_adapter.py b/app/ktv_adapter.py index a6fdc27..1de0807 100644 --- a/app/ktv_adapter.py +++ b/app/ktv_adapter.py @@ -601,33 +601,32 @@ async def handle_storyboard_generating(tenant_id, task_id, step_name, input_data async def handle_scene_video_generating(tenant_id, task_id, step_name, input_data, config): - """通过 /v1/video/generations 生成场景视频。""" + """通过 /v1/video/generations 生成场景视频,模型由客户选择。""" work_dir = _task_dir(task_id) storyboard = None - char_images = None + selected_model = "wan2.6-t2v" # 默认 for dep_output in input_data.values(): if isinstance(dep_output, dict): if dep_output.get("storyboard"): storyboard = dep_output["storyboard"] - if dep_output.get("character_images"): char_images = dep_output["character_images"] - + if dep_output.get("selected_model"): selected_model = dep_output["selected_model"] if not storyboard: raise ValueError("上游步骤未提供分镜脚本") + logger.info(f"Using model: {selected_model}") client = get_ktv_client() await client._ensure_session() scene_videos = [] for i, scene in enumerate(storyboard): desc = scene.get("description", "") - duration = scene.get("end_time", 10) - scene.get("start_time", 5) + duration = int(scene.get("end_time", 10) - scene.get("start_time", 5)) - body = {"model": "wan2.6-t2v", "catelogid": "t2v", - "prompt": desc, "duration": str(int(duration))} + body = {"model": selected_model, "catelogid": "t2v", + "prompt": desc, "duration": str(duration)} url = f"{client.base}/video/generations" async with client._session.post(url, json=body) as resp: data = await resp.json() - # 视频生成是异步的 taskid = data.get("taskid", "") if taskid: data = await client._poll(taskid) @@ -637,12 +636,11 @@ async def handle_scene_video_generating(tenant_id, task_id, step_name, input_dat if video_url: await _download(video_url, local_scene) - scene_videos.append({"scene_id": scene.get("scene_id", i), - "video_path": local_scene, "description": desc, - "duration": duration}) + scene_videos.append({"scene_id": i, "video_path": local_scene, + "description": desc, "duration": duration}) return {"scene_videos": scene_videos, "scene_count": len(scene_videos), - "selected_model": "wan2.6-t2v"} + "selected_model": selected_model} async def handle_scene_video_evaluating(tenant_id, task_id, step_name, input_data, config):