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..63e34016 100644 --- a/ollama/_client.py +++ b/ollama/_client.py @@ -628,6 +628,13 @@ def list(self) -> ListResponse: 'GET', '/api/tags', ) + + def version(self) -> str: + r = self._request_raw( + 'GET', + '/api/version' + ) + return r.json().get('version', '') def delete(self, model: str) -> StatusResponse: r = self._request_raw( @@ -1270,6 +1277,14 @@ async def list(self) -> ListResponse: '/api/tags', ) + async def version(self) -> str: + r = await self._request_raw( + 'GET', + '/api/version', + ) + 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():