Changelog
=========
All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog `_,
and this project adheres to `Semantic Versioning `_.
[0.4.1] - 2026-07-06
--------------------
Changed
~~~~~~~
- Updated project metadata
[0.4.0] - 2025-07-06
--------------------
A major redesign that unifies the two previous classifier classes
(``OllamaClassifier`` and ``LLMClassifier``) into a single backend-agnostic
``LLMClassifier`` backed by a unified ``LLMBackend`` ABC, and introduces two
distinct confidence scoring methods. **This release contains breaking
changes.**
Added
~~~~~
- ``OllamaBackend`` — inference backend for the Ollama runtime (≥v0.12),
using the native Ollama SDK behind the unified ``LLMBackend`` interface
- Adaptive ``generate()`` with budget-controlled ``max_calls``: ``1`` for
fast/approximate, ``K`` for adaptive resolution, ``None`` for exact. Makes
1 to ``max_calls`` constrained API calls and reconstructs per-label
logprobs from a prefix trie over label tokens
- ``coverage`` (per-label fraction of tokens scored) and ``n_calls`` (API
calls made) fields on ``ClassificationResult``
- ``method`` field on ``ClassificationResult`` (``"adaptive_generate"`` or
``"multi_call"``) and ``approximate`` flag
- ``ollama_classifier.scoring`` module with geometric-mean normalization,
prefix-trie, divergence-aware scoring, and cluster resolution
- ``supports_bare_label_constraint`` property on ``LLMBackend`` to drive
context-dependent tokenization (bare labels vs. JSON-wrapped labels)
- Comprehensive test suite (52 tests, including integration tests with
mocked backends)
- Parallelized batch methods (sync via thread pool, async via
``asyncio.gather``)
Changed
~~~~~~~
- **BREAKING:** ``generate()`` now returns a ``ClassificationResult`` (was
a ``str`` in 0.3.0)
- **BREAKING:** Unified into a single ``LLMClassifier`` class. The old
``OllamaClassifier`` (from ``classifier.py``) and the old
``LLMClassifier`` (from ``llm_classifier.py``) are replaced by one
``LLMClassifier`` that accepts any ``LLMBackend``
- **BREAKING:** ``classify()`` rewritten: now uses multi-call completion
scoring with geometric-mean normalization, eliminating the concentration
(token-count) bias present in earlier versions. Makes N calls for N labels
- ``ClassificationResult`` is now a Pydantic ``BaseModel`` (was a dataclass)
- ``httpx`` and ``pydantic`` are now **required** dependencies (were optional
under the ``[backends]`` extra)
- ``ollama`` Python SDK is now an **optional** dependency, installed via the
``[ollama]`` extra (only required when using ``OllamaBackend``)
- All backends now communicate via HTTP using the OpenAI-compatible API and
implement ``chat()``, ``score()``, ``tokenize()``, and their async variants
Fixed
~~~~~
- Concentration bias (token-count bias) in confidence scoring — fixed by
applying geometric-mean normalization across both ``generate()`` and
``classify()``
- Silent ``0.0`` logprob fallback for unscored tokens — unscored tokens now
use ``-inf`` so they are correctly handled by softmax
- Code duplication between ``OllamaClassifier`` and the old
``LLMClassifier`` — eliminated by the unified architecture
Removed
~~~~~~~
- ``OllamaClassifier`` class (replaced by ``LLMClassifier`` + ``OllamaBackend``)
- Old ``LLMClassifier`` from ``llm_classifier.py`` (replaced by the unified
``LLMClassifier`` in ``classifier.py``)
- ``[backends]`` optional dependency group (``httpx`` is now a core dependency)
[0.3.0] - 2025-04-27
--------------------
Added
~~~~~
- ``LLMClassifier`` — a generic, backend-agnostic classifier that works with any inference engine
- ``VLLMBackend`` — inference backend for vLLM (local and remote)
- ``SGLangBackend`` — inference backend for SGLang (local and remote)
- ``LlamaCppBackend`` — inference backend for llama.cpp server (local and remote)
- ``ollama_classifier.backends`` package with ``LLMBackend`` abstract base class
- ``[backends]`` optional dependency group (``httpx``) for non-Ollama engines
- ``docs/backends.rst`` — dedicated documentation page for inference backends
Changed
~~~~~~~
- Bumped package version to 0.3.0
[0.1.0] - 2024-01-01
--------------------
Added
~~~~~
- Initial release
- ``OllamaClassifier`` class with sync and async methods
- Constrained output generation using JSON schema
- Two scoring methods: fast (single-call) and complete (multi-call with softmax)
- Batch processing support
- Support for simple labels and labels with descriptions
- Custom system prompt support
- ``ClassificationResult`` dataclass for structured results