From 5f18bcf6f838f02df856b54b32d5c1040150cfd5 Mon Sep 17 00:00:00 2001 From: red person Date: Wed, 28 Oct 2026 14:52:12 +0300 Subject: [PATCH] fix(models): retain valid discovery IDs beside malformed rows --- src/model_discovery.py | 5 +++- tests/test_model_discovery_model_ids.py | 33 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 tests/test_model_discovery_model_ids.py diff --git a/src/model_discovery.py b/src/model_discovery.py index 116951f9d..71b24d558 100644 --- a/src/model_discovery.py +++ b/src/model_discovery.py @@ -193,7 +193,10 @@ class ModelDiscovery: data = r.json() # Some OpenAI-compatible servers return a bare list, not {"data": [...]}. items = data if isinstance(data, list) else ((data or {}).get("data") or []) - ids = [m.get("id") for m in items if isinstance(m, dict) and m.get("id")] + ids = [ + m["id"] for m in items + if isinstance(m, dict) and isinstance(m.get("id"), str) and m["id"] + ] if ids: return { "host": host, diff --git a/tests/test_model_discovery_model_ids.py b/tests/test_model_discovery_model_ids.py new file mode 100644 index 000000000..3cd8bd544 --- /dev/null +++ b/tests/test_model_discovery_model_ids.py @@ -0,0 +1,33 @@ +"""A malformed provider row must not hide its valid neighboring models.""" +import pytest + +from src.model_discovery import ModelDiscovery + + +@pytest.mark.parametrize('wrapped', [False, True], ids=['bare', 'openai']) +@pytest.mark.parametrize('invalid_id', [None, '', 0, False, [], {}, 42, True, ['bad'], {'bad': 'id'}]) +def test_discovery_keeps_valid_models_beside_invalid_ids(monkeypatch, wrapped, invalid_id): + discovery = ModelDiscovery('fixture') + rows = [{'id': '/valid-model'}, {'id': invalid_id}, 'not a row', None, {'id': 'second-model'}] + payload = {'data': rows} if wrapped else rows + + class Response: + is_success = True + def json(self):return payload + + monkeypatch.setattr('src.model_discovery.httpx.get', lambda *_args, **_kwargs: Response()) + monkeypatch.setattr(discovery, '_fingerprint_provider', lambda *_:'fixture') + result = discovery._check_port('fixture', 8080) + assert result is not None + assert result['models'] == ['/valid-model', 'second-model'] + assert result['models_display'] == ['valid-model', 'second-model'] + assert result['provider'] == 'fixture' + + +@pytest.mark.parametrize('payload', [{'data': [{'id': 42}]}, [{'id': ['bad']}], {'data': []}]) +def test_discovery_with_no_valid_ids_stays_unavailable(monkeypatch, payload): + class Response: + is_success = True + def json(self):return payload + monkeypatch.setattr('src.model_discovery.httpx.get', lambda *_args, **_kwargs:Response()) + assert ModelDiscovery('fixture')._check_port('fixture',8080) is None