Files
Andy RatsirarsonandClaude Sonnet 5 3ea918e84c Add Gemini Omni Flash support and fix stale Veo model listings
- 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
2026-09-07 20:44:24 -07:00

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