From a709432a069a1b8076b9d11a0225ebbad154d197 Mon Sep 17 00:00:00 2001 From: JAYA DILEEP Date: Sun, 6 Sep 2026 05:16:39 +0000 Subject: [PATCH] fix(types): preserve projector_info on ShowResponse Multimodal /api/show responses may include projector_info. ShowResponse did not declare the field, so Pydantic silently dropped it. Fixes #346 Signed-off-by: JAYA DILEEP --- ollama/_types.py | 3 +++ tests/test_type_serialization.py | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/ollama/_types.py b/ollama/_types.py index b9bb53cb..89f6d8fc 100644 --- a/ollama/_types.py +++ b/ollama/_types.py @@ -574,6 +574,9 @@ class ShowResponse(SubscriptableBaseModel): modelinfo: Optional[Mapping[str, Any]] = Field(alias='model_info') + projector_info: Optional[Mapping[str, Any]] = None + 'Projector metadata for multimodal models (when present in /api/show).' + parameters: Optional[str] = None capabilities: Optional[List[str]] = None diff --git a/tests/test_type_serialization.py b/tests/test_type_serialization.py index 02a69e95..3a7a7409 100644 --- a/tests/test_type_serialization.py +++ b/tests/test_type_serialization.py @@ -105,3 +105,30 @@ 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_show_response_preserves_projector_info(): + """/api/show may include projector_info for multimodal models.""" + from ollama._types import ShowResponse + + payload = { + 'modelfile': 'FROM llava', + 'template': '{{ .Prompt }}', + 'parameters': 'num_ctx 4096', + 'details': { + 'parent_model': '', + 'format': 'gguf', + 'family': 'llama', + 'families': ['llama'], + 'parameter_size': '7B', + 'quantization_level': 'Q4_0', + }, + 'model_info': {'general.architecture': 'llama'}, + 'projector_info': {'clip.projection_dim': 768}, + 'capabilities': ['completion', 'vision'], + } + + response = ShowResponse.model_validate(payload) + assert response.projector_info == {'clip.projection_dim': 768} + dumped = response.model_dump() + assert dumped['projector_info'] == {'clip.projection_dim': 768}