- Merge Omni Flash into the existing "gemini" provider: one dropdown entry, model list now includes both Veo and Omni Flash ids, each revealing its own correct settings (resolution/duration/etc). - Omni Flash runs through litellm's request/response Interactions API (litellm.interactions.acreate) instead of the polling avideo_generation/avideo_status/avideo_content trio Veo and the other providers use, since it has no status-polling endpoint. Text-to-video only for now; image/video-conditioned input and conversational editing aren't implemented yet. - Fix progress reporting for the Omni path: it now ticks up by elapsed/timeout while waiting on the single request instead of sitting at 0% and jumping straight to done. - Fix live Veo model listing to filter out models Google's API no longer serves for generation (checks supported_actions for predictLongRunning) rather than trusting name-matching alone — root cause of a live 404 on veo-3.1-fast-generate-001, which is also dropped from the static fallback list. - Bump litellm 1.92.0 -> 1.100.0. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVFBqa77Zo9t4ps8wt7YB2
89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
import sys
|
|
import types
|
|
|
|
import pytest
|
|
|
|
from src.models.gemini import GeminiModel
|
|
|
|
|
|
class FakeGenaiModel:
|
|
def __init__(self, name, supported_actions=None):
|
|
self.name = name
|
|
self.supported_actions = supported_actions
|
|
|
|
|
|
def _install_fake_genai(models):
|
|
fake_models = types.SimpleNamespace(list=lambda: models)
|
|
fake_client_instance = types.SimpleNamespace(models=fake_models)
|
|
fake_genai_module = types.SimpleNamespace(Client=lambda: fake_client_instance)
|
|
google_module = types.ModuleType("google")
|
|
google_module.genai = fake_genai_module
|
|
sys.modules["google"] = google_module
|
|
sys.modules["google.genai"] = fake_genai_module
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _reset_cache():
|
|
GeminiModel._models_cache = None
|
|
yield
|
|
GeminiModel._models_cache = None
|
|
sys.modules.pop("google", None)
|
|
sys.modules.pop("google.genai", None)
|
|
|
|
|
|
def test_excludes_veo_model_missing_predict_long_running():
|
|
_install_fake_genai(
|
|
[
|
|
FakeGenaiModel("models/veo-3.1-fast-generate-001", supported_actions=["generateContent"]),
|
|
FakeGenaiModel("models/veo-3.1-fast-generate-preview", supported_actions=["predictLongRunning"]),
|
|
]
|
|
)
|
|
|
|
models = GeminiModel.list_models()
|
|
|
|
assert "veo-3.1-fast-generate-001" not in models
|
|
assert "veo-3.1-fast-generate-preview" in models
|
|
|
|
|
|
def test_keeps_veo_model_with_unknown_supported_actions():
|
|
_install_fake_genai(
|
|
[
|
|
FakeGenaiModel("models/veo-3.1-generate-preview", supported_actions=None),
|
|
]
|
|
)
|
|
|
|
models = GeminiModel.list_models()
|
|
|
|
assert "veo-3.1-generate-preview" in models
|
|
|
|
|
|
def test_omni_models_not_filtered_by_supported_actions():
|
|
_install_fake_genai(
|
|
[
|
|
FakeGenaiModel("models/gemini-omni-flash-preview", supported_actions=["generateContent"]),
|
|
]
|
|
)
|
|
|
|
models = GeminiModel.list_models()
|
|
|
|
assert "gemini-omni-flash-preview" in models
|
|
|
|
|
|
def test_falls_back_to_static_models_when_genai_list_fails():
|
|
def _raise():
|
|
raise RuntimeError("no api key")
|
|
|
|
fake_models = types.SimpleNamespace(list=_raise)
|
|
fake_client_instance = types.SimpleNamespace(models=fake_models)
|
|
fake_genai_module = types.SimpleNamespace(Client=lambda: fake_client_instance)
|
|
google_module = types.ModuleType("google")
|
|
google_module.genai = fake_genai_module
|
|
sys.modules["google"] = google_module
|
|
sys.modules["google.genai"] = fake_genai_module
|
|
|
|
models = GeminiModel.list_models()
|
|
|
|
assert "veo-3.1-fast-generate-001" not in models
|
|
assert "veo-3.1-fast-generate-preview" in models
|
|
assert "gemini-omni-1.1-flash" in models
|