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
This commit is contained in:
ravivarmanr26
2026-04-13 23:06:39 +05:30
parent dbccf192ac
commit dbf9e4405d
3 changed files with 71 additions and 2 deletions
+4 -1
View File
@@ -1,4 +1,4 @@
from ollama._client import AsyncClient, Client from ollama._client import AsyncClient, Client, __version__
from ollama._types import ( from ollama._types import (
ChatResponse, ChatResponse,
EmbeddingsResponse, EmbeddingsResponse,
@@ -23,6 +23,8 @@ __all__ = [
'AsyncClient', 'AsyncClient',
'ChatResponse', 'ChatResponse',
'Client', 'Client',
'__version__',
'version',
'EmbedResponse', 'EmbedResponse',
'EmbeddingsResponse', 'EmbeddingsResponse',
'GenerateResponse', 'GenerateResponse',
@@ -55,5 +57,6 @@ list = _client.list
copy = _client.copy copy = _client.copy
show = _client.show show = _client.show
ps = _client.ps ps = _client.ps
version = _client.version
web_search = _client.web_search web_search = _client.web_search
web_fetch = _client.web_fetch web_fetch = _client.web_fetch
+22
View File
@@ -629,6 +629,16 @@ class Client(BaseClient):
'/api/tags', '/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: def delete(self, model: str) -> StatusResponse:
r = self._request_raw( r = self._request_raw(
'DELETE', 'DELETE',
@@ -1270,6 +1280,18 @@ class AsyncClient(BaseClient):
'/api/tags', '/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: async def delete(self, model: str) -> StatusResponse:
r = await self._request_raw( r = await self._request_raw(
'DELETE', 'DELETE',
+45 -1
View File
@@ -5,7 +5,7 @@ import re
import tempfile import tempfile
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
import ollama
import pytest import pytest
from httpx import Response as httpxResponse from httpx import Response as httpxResponse
from pydantic import BaseModel 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' 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 test_client_chat_stream(httpserver: HTTPServer):
def stream_handler(_: Request): def stream_handler(_: Request):
def generate(): def generate():