From 49297a8a9ea0c93a1536aef5e46f3260c62b992c Mon Sep 17 00:00:00 2001 From: JAYA DILEEP Date: Sun, 6 Sep 2026 05:13:54 +0000 Subject: [PATCH] fix(types): preserve name on ListResponse models from /api/tags The Ollama /api/tags endpoint returns both name and model for each entry. ListResponse.Model only declared model, so name was silently dropped during validation. Fixes #487 Signed-off-by: JAYA DILEEP --- ollama/_types.py | 5 +++++ tests/test_type_serialization.py | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/ollama/_types.py b/ollama/_types.py index b9bb53cb..667ce4b1 100644 --- a/ollama/_types.py +++ b/ollama/_types.py @@ -517,7 +517,12 @@ class ModelDetails(SubscriptableBaseModel): class ListResponse(SubscriptableBaseModel): class Model(SubscriptableBaseModel): + name: Optional[str] = None + 'Name of the model as returned by /api/tags.' + model: Optional[str] = None + 'Model name (same as name in current Ollama API responses).' + modified_at: Optional[datetime] = None digest: Optional[str] = None size: Optional[ByteSize] = None diff --git a/tests/test_type_serialization.py b/tests/test_type_serialization.py index 02a69e95..8d5bfbab 100644 --- a/tests/test_type_serialization.py +++ b/tests/test_type_serialization.py @@ -105,3 +105,37 @@ def test_create_request_serialization_license_list(): request = CreateRequest(model='test-model', license=['MIT', 'Apache-2.0']) serialized = request.model_dump() assert serialized['license'] == ['MIT', 'Apache-2.0'] + + +def test_list_response_preserves_name_and_model(): + """/api/tags returns both name and model; neither should be dropped.""" + from ollama._types import ListResponse + + payload = { + 'models': [ + { + 'name': 'llama3.2:latest', + 'model': 'llama3.2:latest', + 'modified_at': '2025-05-04T17:37:44.706015396-07:00', + 'size': 2019393189, + 'digest': 'abc123', + 'details': { + 'parent_model': '', + 'format': 'gguf', + 'family': 'llama', + 'families': ['llama'], + 'parameter_size': '3.2B', + 'quantization_level': 'Q4_K_M', + }, + } + ] + } + + response = ListResponse.model_validate(payload) + model = response.models[0] + assert model.name == 'llama3.2:latest' + assert model.model == 'llama3.2:latest' + assert model['name'] == 'llama3.2:latest' + dumped = model.model_dump() + assert dumped['name'] == 'llama3.2:latest' + assert dumped['model'] == 'llama3.2:latest'