diff --git a/README.md b/README.md index 30dc1bc..8c63df1 100644 --- a/README.md +++ b/README.md @@ -187,13 +187,13 @@ Prometheus 可直接抓 `/metrics`。如果部署到 Kubernetes,建议只在 | `veo_3_1_t2v_fast_ultra_relaxed` | 文生视频 | 横屏 | | `veo_3_1_t2v_portrait` | 文生视频 | 竖屏 | | `veo_3_1_t2v_landscape` | 文生视频 | 横屏 | -| `veo_3_1_t2v_4s` | 文生视频 4秒 | 横屏 | +| `veo_3_1_t2v_landscape_4s` | 文生视频 4秒 | 横屏 | | `veo_3_1_t2v_portrait_4s` | 文生视频 4秒 | 竖屏 | -| `veo_3_1_t2v_6s` | 文生视频 6秒 | 横屏 | +| `veo_3_1_t2v_landscape_6s` | 文生视频 6秒 | 横屏 | | `veo_3_1_t2v_portrait_6s` | 文生视频 6秒 | 竖屏 | -| `veo_3_1_t2v_fast_4s` | 文生视频 Fast 4秒 | 横屏 | +| `veo_3_1_t2v_fast_landscape_4s` | 文生视频 Fast 4秒 | 横屏 | | `veo_3_1_t2v_fast_portrait_4s` | 文生视频 Fast 4秒 | 竖屏 | -| `veo_3_1_t2v_fast_6s` | 文生视频 Fast 6秒 | 横屏 | +| `veo_3_1_t2v_fast_landscape_6s` | 文生视频 Fast 6秒 | 横屏 | | `veo_3_1_t2v_fast_portrait_6s` | 文生视频 Fast 6秒 | 竖屏 | | `veo_3_1_t2v_lite_portrait` | 文生视频 Lite | 竖屏 | | `veo_3_1_t2v_lite_landscape` | 文生视频 Lite | 横屏 | @@ -221,13 +221,13 @@ Prometheus 可直接抓 `/metrics`。如果部署到 Kubernetes,建议只在 | `veo_3_1_i2v_s_fast_ultra_relaxed` | 图生视频 | 横屏 | | `veo_3_1_i2v_s_portrait` | 图生视频 | 竖屏 | | `veo_3_1_i2v_s_landscape` | 图生视频 | 横屏 | -| `veo_3_1_i2v_s_4s` | 图生视频 4秒 | 横屏 | +| `veo_3_1_i2v_s_landscape_4s` | 图生视频 4秒 | 横屏 | | `veo_3_1_i2v_s_portrait_4s` | 图生视频 4秒 | 竖屏 | -| `veo_3_1_i2v_s_6s` | 图生视频 6秒 | 横屏 | +| `veo_3_1_i2v_s_landscape_6s` | 图生视频 6秒 | 横屏 | | `veo_3_1_i2v_s_portrait_6s` | 图生视频 6秒 | 竖屏 | -| `veo_3_1_i2v_s_fast_4s_fl` | 图生视频 Fast 4秒 | 横屏 | +| `veo_3_1_i2v_s_fast_landscape_4s_fl` | 图生视频 Fast 4秒 | 横屏 | | `veo_3_1_i2v_s_fast_portrait_4s_fl` | 图生视频 Fast 4秒 | 竖屏 | -| `veo_3_1_i2v_s_fast_6s_fl` | 图生视频 Fast 6秒 | 横屏 | +| `veo_3_1_i2v_s_fast_landscape_6s_fl` | 图生视频 Fast 6秒 | 横屏 | | `veo_3_1_i2v_s_fast_portrait_6s_fl` | 图生视频 Fast 6秒 | 竖屏 | | `veo_3_1_i2v_lite_portrait` | 图生视频 Lite(仅首帧) | 竖屏 | | `veo_3_1_i2v_lite_landscape` | 图生视频 Lite(仅首帧) | 横屏 | @@ -258,11 +258,11 @@ Prometheus 可直接抓 `/metrics`。如果部署到 Kubernetes,建议只在 | 模型名称 | 说明| 尺寸 | |---------|---------|--------| | `veo_3_1_r2v_fast_portrait` | 图生视频 | 竖屏 | -| `veo_3_1_r2v_fast` | 图生视频 | 横屏 | +| `veo_3_1_r2v_fast_landscape` | 图生视频 | 横屏 | | `veo_3_1_r2v_fast_portrait_ultra` | 图生视频 | 竖屏 | -| `veo_3_1_r2v_fast_ultra` | 图生视频 | 横屏 | +| `veo_3_1_r2v_fast_landscape_ultra` | 图生视频 | 横屏 | | `veo_3_1_r2v_fast_portrait_ultra_relaxed` | 图生视频 | 竖屏 | -| `veo_3_1_r2v_fast_ultra_relaxed` | 图生视频 | 横屏 | +| `veo_3_1_r2v_fast_landscape_ultra_relaxed` | 图生视频 | 横屏 | #### 视频放大模型 (Upsample) @@ -270,17 +270,17 @@ Prometheus 可直接抓 `/metrics`。如果部署到 Kubernetes,建议只在 | 模型名称 | 说明 | 输出 | |---------|---------|--------| -| `veo_3_1_t2v_4k` | 文生视频放大 | 4K | +| `veo_3_1_t2v_landscape_4k` | 文生视频放大 | 4K | | `veo_3_1_t2v_portrait_4k` | 文生视频放大 | 4K | -| `veo_3_1_t2v_1080p` | 文生视频放大 | 1080P | +| `veo_3_1_t2v_landscape_1080p` | 文生视频放大 | 1080P | | `veo_3_1_t2v_portrait_1080p` | 文生视频放大 | 1080P | -| `veo_3_1_t2v_4s_4k` | 文生视频 4秒放大 | 4K | +| `veo_3_1_t2v_landscape_4s_4k` | 文生视频 4秒放大 | 4K | | `veo_3_1_t2v_portrait_4s_4k` | 文生视频 4秒放大 | 4K | -| `veo_3_1_t2v_4s_1080p` | 文生视频 4秒放大 | 1080P | +| `veo_3_1_t2v_landscape_4s_1080p` | 文生视频 4秒放大 | 1080P | | `veo_3_1_t2v_portrait_4s_1080p` | 文生视频 4秒放大 | 1080P | -| `veo_3_1_t2v_6s_4k` | 文生视频 6秒放大 | 4K | +| `veo_3_1_t2v_landscape_6s_4k` | 文生视频 6秒放大 | 4K | | `veo_3_1_t2v_portrait_6s_4k` | 文生视频 6秒放大 | 4K | -| `veo_3_1_t2v_6s_1080p` | 文生视频 6秒放大 | 1080P | +| `veo_3_1_t2v_landscape_6s_1080p` | 文生视频 6秒放大 | 1080P | | `veo_3_1_t2v_portrait_6s_1080p` | 文生视频 6秒放大 | 1080P | | `veo_3_1_t2v_fast_portrait_4k` | 文生视频放大 | 4K | | `veo_3_1_t2v_fast_4k` | 文生视频放大 | 4K | @@ -294,22 +294,22 @@ Prometheus 可直接抓 `/metrics`。如果部署到 Kubernetes,建议只在 | `veo_3_1_i2v_s_fast_ultra_fl_4k` | 图生视频放大 | 4K | | `veo_3_1_i2v_s_fast_portrait_ultra_fl_1080p` | 图生视频放大 | 1080P | | `veo_3_1_i2v_s_fast_ultra_fl_1080p` | 图生视频放大 | 1080P | -| `veo_3_1_i2v_s_4k` | 图生视频放大 | 4K | +| `veo_3_1_i2v_s_landscape_4k` | 图生视频放大 | 4K | | `veo_3_1_i2v_s_portrait_4k` | 图生视频放大 | 4K | -| `veo_3_1_i2v_s_1080p` | 图生视频放大 | 1080P | +| `veo_3_1_i2v_s_landscape_1080p` | 图生视频放大 | 1080P | | `veo_3_1_i2v_s_portrait_1080p` | 图生视频放大 | 1080P | -| `veo_3_1_i2v_s_4s_4k` | 图生视频 4秒放大 | 4K | +| `veo_3_1_i2v_s_landscape_4s_4k` | 图生视频 4秒放大 | 4K | | `veo_3_1_i2v_s_portrait_4s_4k` | 图生视频 4秒放大 | 4K | -| `veo_3_1_i2v_s_4s_1080p` | 图生视频 4秒放大 | 1080P | +| `veo_3_1_i2v_s_landscape_4s_1080p` | 图生视频 4秒放大 | 1080P | | `veo_3_1_i2v_s_portrait_4s_1080p` | 图生视频 4秒放大 | 1080P | -| `veo_3_1_i2v_s_6s_4k` | 图生视频 6秒放大 | 4K | +| `veo_3_1_i2v_s_landscape_6s_4k` | 图生视频 6秒放大 | 4K | | `veo_3_1_i2v_s_portrait_6s_4k` | 图生视频 6秒放大 | 4K | -| `veo_3_1_i2v_s_6s_1080p` | 图生视频 6秒放大 | 1080P | +| `veo_3_1_i2v_s_landscape_6s_1080p` | 图生视频 6秒放大 | 1080P | | `veo_3_1_i2v_s_portrait_6s_1080p` | 图生视频 6秒放大 | 1080P | | `veo_3_1_r2v_fast_portrait_ultra_4k` | 多图视频放大 | 4K | -| `veo_3_1_r2v_fast_ultra_4k` | 多图视频放大 | 4K | +| `veo_3_1_r2v_fast_landscape_ultra_4k` | 多图视频放大 | 4K | | `veo_3_1_r2v_fast_portrait_ultra_1080p` | 多图视频放大 | 1080P | -| `veo_3_1_r2v_fast_ultra_1080p` | 多图视频放大 | 1080P | +| `veo_3_1_r2v_fast_landscape_ultra_1080p` | 多图视频放大 | 1080P | ## 📡 API 使用示例(需要使用流式) diff --git a/src/core/monitoring.py b/src/core/monitoring.py index e2bc432..e6e51bc 100644 --- a/src/core/monitoring.py +++ b/src/core/monitoring.py @@ -10,14 +10,45 @@ import urllib.request from datetime import datetime, timezone from typing import Any, Optional -from prometheus_client import ( - CONTENT_TYPE_LATEST, - CollectorRegistry, - Counter, - Gauge, - Histogram, - generate_latest, -) +try: + from prometheus_client import ( + CONTENT_TYPE_LATEST, + CollectorRegistry, + Counter, + Gauge, + Histogram, + generate_latest, + ) +except ModuleNotFoundError: + CONTENT_TYPE_LATEST = "text/plain; version=0.0.4; charset=utf-8" + + class _NoopMetric: + def __init__(self, *args: Any, **kwargs: Any): + pass + + def labels(self, **kwargs: Any) -> "_NoopMetric": + return self + + def inc(self, *args: Any, **kwargs: Any) -> None: + return None + + def set(self, *args: Any, **kwargs: Any) -> None: + return None + + def observe(self, *args: Any, **kwargs: Any) -> None: + return None + + def clear(self) -> None: + return None + + class CollectorRegistry: + def __init__(self, *args: Any, **kwargs: Any): + pass + + Counter = Gauge = Histogram = _NoopMetric + + def generate_latest(registry: Any = None) -> bytes: + return b"# prometheus_client is not installed; metrics are disabled\n" from .config import config diff --git a/src/services/generation_handler.py b/src/services/generation_handler.py index 05f1289..8741379 100644 --- a/src/services/generation_handler.py +++ b/src/services/generation_handler.py @@ -732,6 +732,9 @@ def _apply_veo_3_1_model_updates(): landscape = "VIDEO_ASPECT_RATIO_LANDSCAPE" portrait = "VIDEO_ASPECT_RATIO_PORTRAIT" + def add_alias(alias: str, target: str): + MODEL_CONFIG[alias] = dict(MODEL_CONFIG[target]) + # Non-fast/non-lite Veo 3.1 aliases must call Quality upstream keys. MODEL_CONFIG["veo_3_1_t2v_landscape"].update({"model_key": "veo_3_1_t2v"}) MODEL_CONFIG["veo_3_1_t2v_portrait"].update({"model_key": "veo_3_1_t2v_portrait"}) @@ -851,6 +854,48 @@ def _apply_veo_3_1_model_updates(): "veo_3_1_i2v_s_portrait_fl", portrait, upsample=upsample ) + for seconds in (4, 6): + suffix = f"{seconds}s" + + # Explicit landscape names for /v1/models; short landscape names remain compatible. + add_alias(f"veo_3_1_t2v_fast_landscape_{suffix}", f"veo_3_1_t2v_fast_{suffix}") + add_alias(f"veo_3_1_t2v_landscape_{suffix}", f"veo_3_1_t2v_{suffix}") + add_alias(f"veo_3_1_i2v_s_fast_landscape_{suffix}_fl", f"veo_3_1_i2v_s_fast_{suffix}_fl") + add_alias(f"veo_3_1_i2v_s_landscape_{suffix}", f"veo_3_1_i2v_s_{suffix}") + + add_alias(f"veo_3_1_t2v_lite_landscape_{suffix}", f"veo_3_1_t2v_lite_{suffix}_landscape") + add_alias(f"veo_3_1_t2v_lite_portrait_{suffix}", f"veo_3_1_t2v_lite_{suffix}_portrait") + add_alias(f"veo_3_1_i2v_lite_landscape_{suffix}", f"veo_3_1_i2v_lite_{suffix}_landscape") + add_alias(f"veo_3_1_i2v_lite_portrait_{suffix}", f"veo_3_1_i2v_lite_{suffix}_portrait") + add_alias( + f"veo_3_1_interpolation_lite_landscape_{suffix}", + f"veo_3_1_interpolation_lite_{suffix}_landscape", + ) + add_alias( + f"veo_3_1_interpolation_lite_portrait_{suffix}", + f"veo_3_1_interpolation_lite_{suffix}_portrait", + ) + + for resolution_name in ("4k", "1080p"): + add_alias( + f"veo_3_1_t2v_landscape_{suffix}_{resolution_name}", + f"veo_3_1_t2v_{suffix}_{resolution_name}", + ) + add_alias( + f"veo_3_1_i2v_s_landscape_{suffix}_{resolution_name}", + f"veo_3_1_i2v_s_{suffix}_{resolution_name}", + ) + + for resolution_name in ("4k", "1080p"): + add_alias(f"veo_3_1_t2v_landscape_{resolution_name}", f"veo_3_1_t2v_{resolution_name}") + add_alias(f"veo_3_1_i2v_s_landscape_{resolution_name}", f"veo_3_1_i2v_s_{resolution_name}") + + add_alias("veo_3_1_r2v_fast_landscape", "veo_3_1_r2v_fast") + add_alias("veo_3_1_r2v_fast_landscape_ultra", "veo_3_1_r2v_fast_ultra") + add_alias("veo_3_1_r2v_fast_landscape_ultra_relaxed", "veo_3_1_r2v_fast_ultra_relaxed") + add_alias("veo_3_1_r2v_fast_landscape_ultra_4k", "veo_3_1_r2v_fast_ultra_4k") + add_alias("veo_3_1_r2v_fast_landscape_ultra_1080p", "veo_3_1_r2v_fast_ultra_1080p") + _apply_veo_3_1_model_updates() diff --git a/static/test.html b/static/test.html index 88c6c47..1a45bc6 100644 --- a/static/test.html +++ b/static/test.html @@ -188,35 +188,60 @@ const FALLBACK_MODELS = { "imagen-4.0-generate-preview": "Image generation (alias) - aspects: landscape, portrait", "veo_3_1_t2v_fast": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_t2v_fast_4s": "Video generation (alias) - 4s, supports landscape/portrait via generationConfig", + "veo_3_1_t2v_fast_landscape_4s": "Video generation - fast 4s landscape", "veo_3_1_t2v_fast_6s": "Video generation (alias) - 6s, supports landscape/portrait via generationConfig", + "veo_3_1_t2v_fast_landscape_6s": "Video generation - fast 6s landscape", "veo_3_1_t2v_fast_ultra": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_t2v_fast_ultra_relaxed": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_t2v": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_t2v_4s": "Video generation (alias) - 4s, supports landscape/portrait via generationConfig", + "veo_3_1_t2v_landscape_4s": "Video generation - quality 4s landscape", "veo_3_1_t2v_6s": "Video generation (alias) - 6s, supports landscape/portrait via generationConfig", + "veo_3_1_t2v_landscape_6s": "Video generation - quality 6s landscape", "veo_3_1_t2v_4k": "Video upsample alias - generate then upscale to 4K", + "veo_3_1_t2v_landscape_4k": "Video upsample alias - generate landscape then upscale to 4K", "veo_3_1_t2v_1080p": "Video upsample alias - generate then upscale to 1080P", + "veo_3_1_t2v_landscape_1080p": "Video upsample alias - generate landscape then upscale to 1080P", "veo_3_1_t2v_4s_4k": "Video upsample alias - generate 4s then upscale to 4K", + "veo_3_1_t2v_landscape_4s_4k": "Video upsample alias - generate 4s landscape then upscale to 4K", "veo_3_1_t2v_4s_1080p": "Video upsample alias - generate 4s then upscale to 1080P", + "veo_3_1_t2v_landscape_4s_1080p": "Video upsample alias - generate 4s landscape then upscale to 1080P", "veo_3_1_t2v_6s_4k": "Video upsample alias - generate 6s then upscale to 4K", + "veo_3_1_t2v_landscape_6s_4k": "Video upsample alias - generate 6s landscape then upscale to 4K", "veo_3_1_t2v_6s_1080p": "Video upsample alias - generate 6s then upscale to 1080P", + "veo_3_1_t2v_landscape_6s_1080p": "Video upsample alias - generate 6s landscape then upscale to 1080P", "veo_3_1_i2v_s_fast_fl": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_i2v_s_fast_4s_fl": "Video generation (alias) - 4s, supports landscape/portrait via generationConfig", + "veo_3_1_i2v_s_fast_landscape_4s_fl": "Video generation - fast 4s landscape", "veo_3_1_i2v_s_fast_6s_fl": "Video generation (alias) - 6s, supports landscape/portrait via generationConfig", + "veo_3_1_i2v_s_fast_landscape_6s_fl": "Video generation - fast 6s landscape", "veo_3_1_i2v_s_fast_ultra_fl": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_i2v_s_fast_ultra_relaxed": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_i2v_s": "Video generation (alias) - supports landscape/portrait via generationConfig", "veo_3_1_i2v_s_4s": "Video generation (alias) - 4s, supports landscape/portrait via generationConfig", + "veo_3_1_i2v_s_landscape_4s": "Video generation - quality 4s landscape", "veo_3_1_i2v_s_6s": "Video generation (alias) - 6s, supports landscape/portrait via generationConfig", + "veo_3_1_i2v_s_landscape_6s": "Video generation - quality 6s landscape", "veo_3_1_i2v_s_4k": "Video upsample alias - generate then upscale to 4K", + "veo_3_1_i2v_s_landscape_4k": "Video upsample alias - generate landscape then upscale to 4K", "veo_3_1_i2v_s_1080p": "Video upsample alias - generate then upscale to 1080P", + "veo_3_1_i2v_s_landscape_1080p": "Video upsample alias - generate landscape then upscale to 1080P", "veo_3_1_i2v_s_4s_4k": "Video upsample alias - generate 4s then upscale to 4K", + "veo_3_1_i2v_s_landscape_4s_4k": "Video upsample alias - generate 4s landscape then upscale to 4K", "veo_3_1_i2v_s_4s_1080p": "Video upsample alias - generate 4s then upscale to 1080P", + "veo_3_1_i2v_s_landscape_4s_1080p": "Video upsample alias - generate 4s landscape then upscale to 1080P", "veo_3_1_i2v_s_6s_4k": "Video upsample alias - generate 6s then upscale to 4K", + "veo_3_1_i2v_s_landscape_6s_4k": "Video upsample alias - generate 6s landscape then upscale to 4K", "veo_3_1_i2v_s_6s_1080p": "Video upsample alias - generate 6s then upscale to 1080P", + "veo_3_1_i2v_s_landscape_6s_1080p": "Video upsample alias - generate 6s landscape then upscale to 1080P", "veo_3_1_r2v_fast": "Video generation (alias) - supports landscape/portrait via generationConfig", + "veo_3_1_r2v_fast_landscape": "Video generation - R2V fast landscape", "veo_3_1_r2v_fast_ultra": "Video generation (alias) - supports landscape/portrait via generationConfig", + "veo_3_1_r2v_fast_landscape_ultra": "Video generation - R2V fast ultra landscape", "veo_3_1_r2v_fast_ultra_relaxed": "Video generation (alias) - supports landscape/portrait via generationConfig", + "veo_3_1_r2v_fast_landscape_ultra_relaxed": "Video generation - R2V fast ultra relaxed landscape", + "veo_3_1_r2v_fast_landscape_ultra_4k": "Video upsample alias - generate R2V landscape then upscale to 4K", + "veo_3_1_r2v_fast_landscape_ultra_1080p": "Video upsample alias - generate R2V landscape then upscale to 1080P", }; let ALL_MODELS = {}; diff --git a/tests/test_veo_lite_support.py b/tests/test_veo_lite_support.py index 574dbff..022f5ac 100644 --- a/tests/test_veo_lite_support.py +++ b/tests/test_veo_lite_support.py @@ -105,6 +105,33 @@ class VeoLiteGenerationHandlerTests(unittest.TestCase): self.assertEqual(cfg["upsample"]["model_key"], "veo_3_1_upsampler_1080p") self.assertEqual(cfg["upsample"]["resolution"], "VIDEO_RESOLUTION_1080P") + def test_short_duration_models_include_explicit_landscape_aliases(self): + expected_aliases = { + "veo_3_1_t2v_landscape_4s": "veo_3_1_t2v_4s", + "veo_3_1_t2v_landscape_6s": "veo_3_1_t2v_6s", + "veo_3_1_i2v_s_landscape_4s": "veo_3_1_i2v_s_4s", + "veo_3_1_i2v_s_landscape_6s": "veo_3_1_i2v_s_6s", + "veo_3_1_t2v_landscape_4s_4k": "veo_3_1_t2v_4s_4k", + "veo_3_1_i2v_s_landscape_6s_1080p": "veo_3_1_i2v_s_6s_1080p", + } + + for alias, target in expected_aliases.items(): + self.assertIn(alias, MODEL_CONFIG) + self.assertEqual(MODEL_CONFIG[alias], MODEL_CONFIG[target]) + + def test_r2v_models_include_explicit_landscape_aliases(self): + expected_aliases = { + "veo_3_1_r2v_fast_landscape": "veo_3_1_r2v_fast", + "veo_3_1_r2v_fast_landscape_ultra": "veo_3_1_r2v_fast_ultra", + "veo_3_1_r2v_fast_landscape_ultra_relaxed": "veo_3_1_r2v_fast_ultra_relaxed", + "veo_3_1_r2v_fast_landscape_ultra_4k": "veo_3_1_r2v_fast_ultra_4k", + "veo_3_1_r2v_fast_landscape_ultra_1080p": "veo_3_1_r2v_fast_ultra_1080p", + } + + for alias, target in expected_aliases.items(): + self.assertIn(alias, MODEL_CONFIG) + self.assertEqual(MODEL_CONFIG[alias], MODEL_CONFIG[target]) + def test_direct_upsampler_keys_are_not_public_models(self): self.assertNotIn("veo_3_1_upsampler_4k", MODEL_CONFIG) self.assertNotIn("veo_3_1_upsampler_1080p", MODEL_CONFIG)