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
« 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`.
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.
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"""
13from __future__ import annotations
15import os
16from typing import Any
18from .openai import OpenAIProvider
20DEFAULT_BASE_URL = "http://localhost:11434/v1"
23class OllamaProvider(OpenAIProvider):
24 """OpenAI-compatible client pointed at an Ollama daemon."""
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 )