From dbf9e4405db37fe8caf7440456d50ad8e1825b13 Mon Sep 17 00:00:00 2001 From: ravivarmanr26 Date: Mon, 13 Apr 2026 23:06:39 +0530 Subject: [PATCH 1/2] feat: add version API and expose package version Adds: - ollama.__version__ for the installed package version - .version() method on Client and AsyncClient to fetch /api/version Includes tests. Closes #646 --- ollama/__init__.py | 5 ++++- ollama/_client.py | 22 +++++++++++++++++++++ tests/test_client.py | 46 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/ollama/__init__.py b/ollama/__init__.py index 92bba280..c95693f9 100644 --- a/ollama/__init__.py +++ b/ollama/__init__.py @@ -1,4 +1,4 @@ -from ollama._client import AsyncClient, Client +from ollama._client import AsyncClient, Client, __version__ from ollama._types import ( ChatResponse, EmbeddingsResponse, @@ -23,6 +23,8 @@ 'AsyncClient', 'ChatResponse', 'Client', + '__version__', + 'version', 'EmbedResponse', 'EmbeddingsResponse', 'GenerateResponse', @@ -55,5 +57,6 @@ copy = _client.copy show = _client.show ps = _client.ps +version = _client.version web_search = _client.web_search web_fetch = _client.web_fetch diff --git a/ollama/_client.py b/ollama/_client.py index 18cb0fb4..0726f0fc 100644 --- a/ollama/_client.py +++ b/ollama/_client.py @@ -628,6 +628,16 @@ def list(self) -> ListResponse: 'GET', '/api/tags', ) + + def version(self) -> str: + r = self._request_raw( + 'GET', + '/api/version' + ) + if r.status_code != 200: + raise Exception(f"Request failed: {r.status_code}") + + return r.json().get('version', '') def delete(self, model: str) -> StatusResponse: r = self._request_raw( @@ -1270,6 +1280,18 @@ async def list(self) -> ListResponse: '/api/tags', ) + async def version(self) -> str: + r = await self._request_raw( + 'GET', + '/api/version', + ) + + if r.status_code != 200: + raise Exception(f"Request failed: {r.status_code}") + + return r.json().get('version', '') + + async def delete(self, model: str) -> StatusResponse: r = await self._request_raw( 'DELETE', diff --git a/tests/test_client.py b/tests/test_client.py index 34657513..7adc8549 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -5,7 +5,7 @@ import tempfile from pathlib import Path from typing import Any - +import ollama import pytest from httpx import Response as httpxResponse from pydantic import BaseModel @@ -99,6 +99,50 @@ def test_client_chat_with_logprobs(httpserver: HTTPServer): assert response['logprobs'][0]['top_logprobs'][1]['token'] == 'Hi' +def test_package_version(): + assert hasattr(ollama, '__version__') + assert isinstance(ollama.__version__, str) + assert ollama.__version__ != '' + assert callable(ollama.version) + assert hasattr(ollama, 'version') + + +def test_client_version_missing_field(httpserver: HTTPServer): + httpserver.expect_ordered_request( + '/api/version', + method='GET', + ).respond_with_json({}) + + client = Client(httpserver.url_for('/')) + response = client.version() + assert response == '' + + +async def test_async_client_version(httpserver: HTTPServer): + httpserver.expect_ordered_request( + '/api/version', + method='GET', + ).respond_with_json( + { + 'version': '0.1.0', + } + ) + + client = AsyncClient(httpserver.url_for('/')) + response = await client.version() + assert response == '0.1.0' + assert isinstance(response, str) + +async def test_async_client_version_missing_field(httpserver: HTTPServer): + httpserver.expect_ordered_request( + '/api/version', + method='GET', + ).respond_with_json({}) + + client = AsyncClient(httpserver.url_for('/')) + response = await client.version() + assert response == '' + def test_client_chat_stream(httpserver: HTTPServer): def stream_handler(_: Request): def generate(): From 40ca3c9300d0661188d8c42bce07686b57d522ca Mon Sep 17 00:00:00 2001 From: ravivarmanr26 Date: Mon, 13 Apr 2026 23:45:49 +0530 Subject: [PATCH 2/2] fix: use _request_raw error handling for version endpoint --- ollama/_client.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ollama/_client.py b/ollama/_client.py index 0726f0fc..63e34016 100644 --- a/ollama/_client.py +++ b/ollama/_client.py @@ -634,9 +634,6 @@ def version(self) -> str: 'GET', '/api/version' ) - if r.status_code != 200: - raise Exception(f"Request failed: {r.status_code}") - return r.json().get('version', '') def delete(self, model: str) -> StatusResponse: @@ -1285,10 +1282,6 @@ async def version(self) -> str: 'GET', '/api/version', ) - - if r.status_code != 200: - raise Exception(f"Request failed: {r.status_code}") - return r.json().get('version', '')