Coverage for astrocyte/providers/ollama.py: 100%

8 statements  

« prev     ^ index     » next       coverage.py v7.15.0, created at 2026-10-29 22:10 +0000

1"""Ollama provider — a thin preset over :class:`OpenAIProvider`. 

2 

3Ollama serves an OpenAI-compatible API, so no separate client is needed. This 

4exists for discoverability rather than capability: ``llm_provider: openai`` with 

5a ``base_url`` override already works, but nothing in the registry says so, and 

6a capability nobody can find is not really a capability. 

7 

8Two ergonomics fixes over configuring OpenAI by hand: ``base_url`` defaults to 

9the local daemon, and ``api_key`` defaults to a placeholder because 

10``OpenAIProvider`` requires one while Ollama ignores it. 

11""" 

12 

13from __future__ import annotations 

14 

15import os 

16from typing import Any 

17 

18from .openai import OpenAIProvider 

19 

20DEFAULT_BASE_URL = "http://localhost:11434/v1" 

21 

22 

23class OllamaProvider(OpenAIProvider): 

24 """OpenAI-compatible client pointed at an Ollama daemon.""" 

25 

26 def __init__( 

27 self, 

28 *, 

29 model: str = "qwen3:8b", 

30 embedding_model: str = "nomic-embed-text", 

31 base_url: str | None = None, 

32 api_key: str | None = None, 

33 read_timeout: float = 600.0, 

34 **kwargs: Any, 

35 ) -> None: 

36 super().__init__( 

37 model=model, 

38 embedding_model=embedding_model, 

39 base_url=base_url or os.environ.get("OLLAMA_BASE_URL") or DEFAULT_BASE_URL, 

40 # Ollama ignores the key; OpenAIProvider refuses to construct without one. 

41 api_key=api_key or os.environ.get("OLLAMA_API_KEY") or "ollama", 

42 # Local inference is slow: OpenAIProvider's 90s default is tuned for a 

43 # hosted API and times out mid-run on consumer hardware. 

44 read_timeout=read_timeout, 

45 **kwargs, 

46 )