From 4c45f719adffa22519cf289832a37e0e3f5d4fed Mon Sep 17 00:00:00 2001 From: yibo Date: Thu, 3 Sep 2026 16:27:35 +0800 Subject: [PATCH] h3-console: /v1/models 的分辨率档位改成实时查 raylight,不再是过期的3档硬编码 --- h3-console/server.py | 30 +++++++++++++++++++----------- raylight/scripts/server.py | 8 ++++++++ raylight/server.py | 8 ++++++++ 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/h3-console/server.py b/h3-console/server.py index 45edf51..43036c0 100644 --- a/h3-console/server.py +++ b/h3-console/server.py @@ -584,22 +584,30 @@ async def reset_gpu(): @api.get("/v1/models") -def models(): - # 静态信息,对应服务器上 api.py 里的 PARTITIONS 常量。只读展示,不做运行时切换。 +async def models(): + # partitions 是静态信息,对应 raylight/server.py 里的 DIT_FL2VA/DIT_REF2VA 常量,只读展示。 + # 2026-09-03:presets 之前是硬编码的3档旧数据(模型文件名对应的是已删除的 api.py/gateway.py + # 那套旧架构,跟 raylight 现在实际用的模型对不上),改成实时问 raylight 的 + # /v1/resolutions(RESOLUTION_CEILINGS 的镜像),保证跟实际支持的分辨率档位一致, + # 不用两边手动同步一份数字。 + try: + resp = await client.get(f"{GATEWAY_URL}/v1/resolutions") + resolutions = resp.json()["resolutions"] if resp.status_code == 200 else [] + except httpx.HTTPError: + resolutions = [] + presets = [ + {"label": f"{r['width']}×{r['height']},最多 {r['max_frames']} 帧(≈{r['max_frames']/24:.1f}s@24fps)", + "width": r["width"], "height": r["height"], "max_frames": r["max_frames"]} + for r in resolutions + ] return { "partitions": { - "fl2va": {"dit": "minimax-h3-fl2va-nf4.safetensors", - "lora": "minimax_h3_fl2v_turbo_4step_v1.0_768p_bf16.safetensors", + "fl2va": {"dit": "minimax_h3_fl2va_pruned_int8_convrot.safetensors", "desc": "首末帧条件生成"}, - "ref2va": {"dit": "minimax-h3-ref2va-nf4.safetensors", - "lora": "minimax_h3_ref2v_turbo_4step_v0.1_comfyui_bf16.safetensors", + "ref2va": {"dit": "minimax_h3_ref2va_pruned_int8_convrot.safetensors", "desc": "文生视频 / 多参考图生成"}, }, - "presets": [ - {"label": "标准档 832×480×124f(5.17s)", "width": 832, "height": 480, "frames": 124}, - {"label": "长时长档 448×256×362f(15s)", "width": 448, "height": 256, "frames": 362}, - {"label": "高分辨率档 1344×768×64f(2.7s)", "width": 1344, "height": 768, "frames": 64}, - ], + "presets": presets, } diff --git a/raylight/scripts/server.py b/raylight/scripts/server.py index e0b429f..a72ba8f 100644 --- a/raylight/scripts/server.py +++ b/raylight/scripts/server.py @@ -715,3 +715,11 @@ def list_videos(limit: int = 50): jobs = sorted(JOBS.values(), key=lambda j: j.created_at, reverse=True)[:limit] return [{"id": j.id, "status": j.status, "created_at": j.created_at, "size_bytes": j.size_bytes, "error": j.error} for j in jobs] + + +@app.get("/v1/resolutions") +def list_resolutions(): + """实测过显存/画质边界的分辨率档位——RESOLUTION_CEILINGS 的只读镜像,给 h3-console + 的 /v1/models 之类的外部查询接口用,不要在别处重复硬编码这份表。""" + return {"resolutions": [{"width": w, "height": h, "max_frames": max_frames} + for (w, h), max_frames in RESOLUTION_CEILINGS.items()]} diff --git a/raylight/server.py b/raylight/server.py index e0b429f..a72ba8f 100644 --- a/raylight/server.py +++ b/raylight/server.py @@ -715,3 +715,11 @@ def list_videos(limit: int = 50): jobs = sorted(JOBS.values(), key=lambda j: j.created_at, reverse=True)[:limit] return [{"id": j.id, "status": j.status, "created_at": j.created_at, "size_bytes": j.size_bytes, "error": j.error} for j in jobs] + + +@app.get("/v1/resolutions") +def list_resolutions(): + """实测过显存/画质边界的分辨率档位——RESOLUTION_CEILINGS 的只读镜像,给 h3-console + 的 /v1/models 之类的外部查询接口用,不要在别处重复硬编码这份表。""" + return {"resolutions": [{"width": w, "height": h, "max_frames": max_frames} + for (w, h), max_frames in RESOLUTION_CEILINGS.items()]} -- libgit2 0.21.4