Merge verified Odysseus fixes

This commit is contained in:
pewdiepie-archdaemon
2026-07-23 14:49:08 +00:00
parent 93107c5415
commit cf4e240ad1
246 changed files with 28636 additions and 5493 deletions
+310 -3
View File
@@ -48,6 +48,9 @@ with preserve_import_state("core.database", "src.database", "core.session_manage
_ping_endpoint,
_parse_model_list,
_normalize_refresh_mode,
_normalize_endpoint_refresh_mode,
_endpoint_refresh_mode,
_is_google_api_base,
_truthy,
_speech_settings_using_endpoint,
_clear_speech_settings_for_endpoint,
@@ -436,6 +439,9 @@ class TestClassifyEndpoint:
def test_public_api(self):
assert _classify_endpoint("https://api.openai.com/v1") == "api"
def test_openrouter_api(self):
assert _classify_endpoint("https://openrouter.ai/api/v1") == "api"
def test_empty_string(self):
assert _classify_endpoint("") == "api"
@@ -464,6 +470,28 @@ class TestClassifyEndpoint:
assert _normalize_refresh_mode("manual", "proxy") == "manual"
assert _normalize_refresh_mode("auto", "api") == "auto"
def test_google_refresh_mode_defaults_manual_unless_explicit(self):
base = "https://generativelanguage.googleapis.com/v1beta/openai"
assert _normalize_endpoint_refresh_mode("", "api", base) == "manual"
assert _normalize_endpoint_refresh_mode(None, "auto", base) == "manual"
assert _normalize_endpoint_refresh_mode("auto", "api", base) == "auto"
def test_only_gemini_native_host_uses_google_models_api(self):
assert _is_google_api_base("https://generativelanguage.googleapis.com/v1beta/openai") is True
assert _is_google_api_base(
"https://us-central1-aiplatform.googleapis.com/v1/projects/p/locations/us-central1/endpoints/openapi"
) is False
def test_existing_google_endpoint_refresh_mode_defaults_manual(self):
ep = SimpleNamespace(
model_refresh_mode=None,
endpoint_kind="api",
base_url="https://generativelanguage.googleapis.com/v1beta/openai",
)
assert _endpoint_refresh_mode(ep, "api") == "manual"
ep.model_refresh_mode = "auto"
assert _endpoint_refresh_mode(ep, "api") == "auto"
def test_parse_model_list_accepts_json_and_text(self):
assert _parse_model_list('["a", "b", "a"]') == ["a", "b"]
assert _parse_model_list("a, b\nc") == ["a", "b", "c"]
@@ -568,6 +596,83 @@ class TestSetupProbeSafety:
assert _probe_endpoint("https://api.groq.com/openai/v1") == _PROVIDER_CURATED["groq"]
def test_google_probe_uses_native_paginated_models_api(self, monkeypatch):
monkeypatch.setattr(endpoint_resolver, "resolve_url", lambda url: url, raising=False)
monkeypatch.setattr(model_routes, "_normalize_base", lambda url: url.rstrip("/"))
seen = []
def fake_get(url, headers=None, params=None, timeout=None, verify=None, **kwargs):
seen.append((url, headers, params, timeout, verify))
request = httpx.Request("GET", url)
page_token = (params or {}).get("pageToken")
if page_token:
return httpx.Response(
200,
request=request,
json={
"models": [{
"name": "models/gemini-page-two",
"supportedGenerationMethods": ["generateContent"],
}]
},
)
return httpx.Response(
200,
request=request,
json={
"models": [
{
"name": "models/gemini-page-one",
"supportedGenerationMethods": ["generateContent"],
},
{
"baseModelId": "gemini-base-id",
"name": "models/ignored-version",
"supportedGenerationMethods": ["generateText"],
},
{
"name": "models/imagen-4.0-generate-001",
"supportedGenerationMethods": ["predict"],
},
{
"name": "models/text-embedding-example",
"supportedGenerationMethods": ["embedContent"],
},
{"name": "models/missing-method-metadata"},
],
"nextPageToken": "next-page",
},
)
monkeypatch.setattr(model_routes.httpx, "get", fake_get)
assert _probe_endpoint("https://generativelanguage.googleapis.com/v1beta/openai", "google-key") == [
"gemini-page-one",
"gemini-base-id",
"gemini-page-two",
]
assert [call[0] for call in seen] == [
"https://generativelanguage.googleapis.com/v1beta/models",
"https://generativelanguage.googleapis.com/v1beta/models",
]
assert seen[0][1] == {"Accept": "application/json", "x-goog-api-key": "google-key"}
assert seen[0][2] == {"pageSize": 1000}
assert seen[1][1] == {"Accept": "application/json", "x-goog-api-key": "google-key"}
assert seen[1][2] == {"pageSize": 1000, "pageToken": "next-page"}
def test_google_probe_does_not_use_curated_fallback_on_failure(self, monkeypatch):
monkeypatch.setattr(endpoint_resolver, "resolve_url", lambda url: url, raising=False)
monkeypatch.setattr(model_routes, "_normalize_base", lambda url: url.rstrip("/"))
def fake_get(url, headers=None, params=None, timeout=None, verify=None, **kwargs):
request = httpx.Request("GET", url)
response = httpx.Response(401, request=request)
raise httpx.HTTPStatusError("unauthorized", request=request, response=response)
monkeypatch.setattr(model_routes.httpx, "get", fake_get)
assert _probe_endpoint("https://generativelanguage.googleapis.com/v1beta/openai", "bad-key") == []
def test_keyed_anthropic_probe_does_not_fallback_on_failure(self, monkeypatch):
monkeypatch.setattr(endpoint_resolver, "resolve_url", lambda url: url, raising=False)
monkeypatch.setattr(model_routes, "_normalize_base", lambda url: url.rstrip("/"))
@@ -908,6 +1013,44 @@ def test_patch_models_pinned_does_not_clobber_hidden(monkeypatch):
assert json.loads(ep.pinned_models) == ["deploy-1"]
def test_patch_api_hidden_payload_converts_to_pinned(monkeypatch):
ep = _make_endpoint(
base_url="https://openrouter.ai/api/v1",
cached_models=json.dumps(["m1", "m2", "m3"]),
pinned_models=None,
)
db = _PinnedFakeDb([ep])
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "require_admin", lambda request: None)
endpoint = _get_route("/api/model-endpoints/{ep_id}/models", "PATCH")
result = asyncio.run(endpoint("ep1", _PinnedFakeRequest(body={"hidden": ["m2"]})))
assert result["pinned_count"] == 2
assert result["hidden_count"] == 0
assert json.loads(ep.pinned_models) == ["m1", "m3"]
assert ep.hidden_models is None
def test_patch_api_hidden_empty_pins_all_cached_models(monkeypatch):
ep = _make_endpoint(
base_url="https://openrouter.ai/api/v1",
cached_models=json.dumps(["m1", "m2", "m3"]),
pinned_models=None,
)
db = _PinnedFakeDb([ep])
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "require_admin", lambda request: None)
endpoint = _get_route("/api/model-endpoints/{ep_id}/models", "PATCH")
result = asyncio.run(endpoint("ep1", _PinnedFakeRequest(body={"hidden": []})))
assert result["pinned_count"] == 3
assert result["hidden_count"] == 0
assert json.loads(ep.pinned_models) == ["m1", "m2", "m3"]
assert ep.hidden_models is None
def test_get_models_returns_pinned_when_probe_empty(monkeypatch):
ep = _make_endpoint(pinned_models=json.dumps(["deploy-1"]))
db = _PinnedFakeDb([ep])
@@ -923,6 +1066,26 @@ def test_get_models_returns_pinned_when_probe_empty(monkeypatch):
assert result[0]["is_pinned"] is True
def test_get_api_models_marks_picker_as_pinned_only(monkeypatch):
ep = _make_endpoint(
base_url="https://api.example.test/v1",
cached_models=json.dumps(["openai/gpt-image-1", "anthropic/claude-sonnet-4"]),
pinned_models=json.dumps(["openai/gpt-image-1"]),
)
db = _PinnedFakeDb([ep])
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "require_admin", lambda request: None)
endpoint = _get_route("/api/model-endpoints/{ep_id}/models", "GET")
result = endpoint("ep1", _PinnedFakeRequest(), SimpleNamespace(headers={}))
by_id = {row["id"]: row for row in result}
assert by_id["openai/gpt-image-1"]["picker_requires_pinning"] is True
assert by_id["openai/gpt-image-1"]["is_pinned"] is True
assert by_id["anthropic/claude-sonnet-4"]["picker_requires_pinning"] is True
assert by_id["anthropic/claude-sonnet-4"]["is_pinned"] is False
def test_reprobe_preserves_pinned_models(monkeypatch):
ep = _make_endpoint(pinned_models=json.dumps(["deploy-1"]))
db = _PinnedFakeDb([ep])
@@ -1082,6 +1245,79 @@ def test_list_model_endpoints_returns_key_fingerprint(monkeypatch):
assert result[1]["api_key_fingerprint"] == ""
def test_list_api_endpoint_reports_inventory_count_when_none_pinned(monkeypatch):
ep = _make_endpoint(
base_url="https://api.example.test/v1",
cached_models=json.dumps(["openai/gpt-image-1", "anthropic/claude-sonnet-4"]),
pinned_models=None,
)
db = _PinnedFakeDb([ep])
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "require_admin", lambda request: None)
endpoint = _get_route("/api/model-endpoints", "GET")
result = endpoint(_PinnedFakeRequest())
assert result[0]["models"] == []
assert result[0]["model_count"] == 2
assert result[0]["picker_requires_pinning"] is True
assert result[0]["status"] == "online"
def test_list_api_endpoint_returns_pinned_picker_models(monkeypatch):
ep = _make_endpoint(
base_url="https://api.example.test/v1",
cached_models=json.dumps(["openai/gpt-image-1", "anthropic/claude-sonnet-4"]),
pinned_models=json.dumps(["openai/gpt-image-1"]),
)
db = _PinnedFakeDb([ep])
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "require_admin", lambda request: None)
endpoint = _get_route("/api/model-endpoints", "GET")
result = endpoint(_PinnedFakeRequest())
assert result[0]["models"] == ["openai/gpt-image-1"]
assert result[0]["pinned_models"] == ["openai/gpt-image-1"]
assert result[0]["model_count"] == 2
def test_list_api_endpoint_pinned_models_ignore_stale_hidden_state(monkeypatch):
ep = _make_endpoint(
base_url="https://api.example.test/v1",
cached_models=json.dumps(["openai/gpt-image-1", "anthropic/claude-sonnet-4"]),
hidden_models=json.dumps(["openai/gpt-image-1"]),
pinned_models=json.dumps(["openai/gpt-image-1"]),
)
db = _PinnedFakeDb([ep])
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "require_admin", lambda request: None)
endpoint = _get_route("/api/model-endpoints", "GET")
result = endpoint(_PinnedFakeRequest())
assert result[0]["models"] == ["openai/gpt-image-1"]
def test_list_api_endpoint_derives_pins_from_legacy_hidden_state(monkeypatch):
ep = _make_endpoint(
base_url="https://openrouter.ai/api/v1",
cached_models=json.dumps(["m1", "m2", "m3"]),
hidden_models=json.dumps(["m2"]),
pinned_models=None,
)
db = _PinnedFakeDb([ep])
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "require_admin", lambda request: None)
endpoint = _get_route("/api/model-endpoints", "GET")
result = endpoint(_PinnedFakeRequest())
assert result[0]["models"] == ["m1", "m3"]
assert result[0]["pinned_models"] == ["m1", "m3"]
assert json.loads(ep.pinned_models) == ["m1", "m3"]
def test_post_creates_endpoint_with_pinned_models(monkeypatch):
db = _PinnedFakeDb([]) # no existing row → fresh create path
_patch_create_deps(monkeypatch, db)
@@ -1101,6 +1337,26 @@ def test_post_creates_endpoint_with_pinned_models(monkeypatch):
assert json.loads(db.added[0].pinned_models) == ["deploy-1", "deploy-2"]
def test_post_google_endpoint_defaults_to_manual_refresh_when_mode_omitted(monkeypatch):
db = _PinnedFakeDb([])
_patch_create_deps(monkeypatch, db)
monkeypatch.setattr(model_routes, "_probe_endpoint", lambda *args, **kwargs: ["gemini-test"])
create = _get_route("/api/model-endpoints", "POST")
create(
_PinnedFakeRequest(),
base_url="https://generativelanguage.googleapis.com/v1beta/openai",
**_create_form_kwargs(
api_key="google-key",
endpoint_kind="api",
model_refresh_mode="",
),
)
assert len(db.added) == 1
assert db.added[0].model_refresh_mode == "manual"
def test_post_dedupe_existing_merges_and_returns_pinned(monkeypatch):
existing = _make_endpoint(
base_url="http://host:1234/v1",
@@ -1431,11 +1687,12 @@ def test_api_models_scopes_api_token_to_token_owner(monkeypatch):
assert admin_checks == ["alice"]
def test_api_models_returns_cached_proxy_models_without_refresh_probe(monkeypatch):
def test_api_models_returns_only_pinned_proxy_models_without_refresh_probe(monkeypatch):
row = _route_ep(
"proxy",
"http://100.117.136.97:34521/v1",
cached_models=["cached-model"],
cached_models=["cached-model", "other-model"],
pinned_models=["cached-model"],
endpoint_kind="proxy",
api_key="fake-key",
refresh_mode="manual",
@@ -1457,10 +1714,60 @@ def test_api_models_returns_cached_proxy_models_without_refresh_probe(monkeypatc
result = _route_endpoint(router, "/api/models")(_route_request())
assert result["items"][0]["models"] == ["cached-model"]
assert result["items"][0]["models_extra"] == []
assert result["items"][0]["category"] == "api"
assert result["items"][0]["endpoint_kind"] == "proxy"
assert "offline" not in result["items"][0]
assert json.loads(row.cached_models) == ["cached-model"]
assert json.loads(row.cached_models) == ["cached-model", "other-model"]
def test_api_models_openrouter_uses_pinned_models_not_hidden(monkeypatch):
row = _route_ep(
"openrouter",
"https://openrouter.ai/api/v1",
cached_models=["openai/gpt-image-1", "anthropic/claude-sonnet-4"],
pinned_models=["openai/gpt-image-1"],
api_key="fake-key",
)
row.hidden_models = json.dumps(["openai/gpt-image-1"])
db = _RouteDb([row])
router = model_routes.setup_model_routes(model_discovery=None)
monkeypatch.setattr(model_routes, "ModelEndpoint", _RouteModelEndpoint)
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "_auth_disabled", lambda: True)
monkeypatch.setattr(model_routes, "build_chat_url", lambda base: f"{base}/chat/completions")
monkeypatch.setattr(threading, "Thread", _NoopThread)
result = _route_endpoint(router, "/api/models")(_route_request())
assert result["items"][0]["endpoint_name"] == "openrouter"
assert result["items"][0]["category"] == "api"
assert result["items"][0]["models"] == ["openai/gpt-image-1"]
def test_api_models_openrouter_derives_legacy_visible_models(monkeypatch):
row = _route_ep(
"openrouter",
"https://openrouter.ai/api/v1",
cached_models=["m1", "m2", "m3"],
pinned_models=None,
api_key="fake-key",
)
row.hidden_models = json.dumps(["m2"])
db = _RouteDb([row])
router = model_routes.setup_model_routes(model_discovery=None)
monkeypatch.setattr(model_routes, "ModelEndpoint", _RouteModelEndpoint)
monkeypatch.setattr(model_routes, "SessionLocal", lambda: db)
monkeypatch.setattr(model_routes, "_auth_disabled", lambda: True)
monkeypatch.setattr(model_routes, "build_chat_url", lambda base: f"{base}/chat/completions")
monkeypatch.setattr(threading, "Thread", _NoopThread)
result = _route_endpoint(router, "/api/models")(_route_request())
assert result["items"][0]["endpoint_name"] == "openrouter"
assert result["items"][0]["models"] == ["m1", "m3"]
@pytest.mark.asyncio