A wrapper around Ollama Python SDK for text classification with constrained output and confidence scoring
Project description
ollama-classifier
A Python wrapper around the Ollama Python SDK for text classification with constrained output and confidence scoring.
Features
- Constrained Output: Uses JSON schema with enum constraints to ensure only valid choices are generated
- Confidence Scoring: Multi-call evaluation with softmax for calibrated probabilities
- Sync & Async: Full support for both synchronous and asynchronous operations
- Batch Processing: Classify multiple texts efficiently
- Flexible Choices: Support for simple labels or labels with descriptions
- Custom Prompts: Override the default system prompt for specialized tasks
Installation
pip install ollama-classifier
Or with uv:
uv add ollama-classifier
Prerequisites
- Ollama installed and running
- A model pulled (e.g.,
ollama pull llama3.2)
Quick Start
from ollama import Client
from ollama_classifier import OllamaClassifier
client = Client()
classifier = OllamaClassifier(client, model="llama3.2")
result = classifier.classify(
text="I love this product!",
choices=["positive", "negative", "neutral"]
)
print(f"Prediction: {result.prediction}")
print(f"Confidence: {result.confidence:.2%}")
print(f"Probabilities: {result.probabilities}")
Usage
Basic Classification
from ollama import Client
from ollama_classifier import OllamaClassifier
client = Client()
classifier = OllamaClassifier(client, model="llama3.2")
result = classifier.classify(
text="The goalkeeper made an incredible save!",
choices=["sports", "politics", "technology", "entertainment"]
)
Classification with Label Descriptions
Providing descriptions helps the model understand each category better:
choices = {
"positive": "Text expresses happiness, satisfaction, or approval",
"negative": "Text expresses anger, disappointment, or disapproval",
"mixed": "Text contains both positive and negative sentiments",
"neutral": "Text is factual without strong emotional content",
}
result = classifier.classify(
text="The food was amazing but the service was terrible.",
choices=choices
)
Custom System Prompt
result = classifier.classify(
text="The quarterly earnings exceeded analyst expectations.",
choices=["bullish", "bearish", "neutral"],
system_prompt="You are a financial sentiment analyzer. "
"Classify financial news based on market sentiment."
)
Scoring (Multi-Call with Softmax)
Get calibrated probability distribution over all choices. Makes N API calls for N choices:
result = classifier.score(
text="The movie was fantastic!",
choices=["positive", "negative", "neutral"]
)
Generate Only (Fastest)
When you only need the prediction without confidence scores:
prediction = classifier.generate(
text="The team won the championship!",
choices=["sports", "finance", "politics"]
)
Batch Classification
texts = [
"The goalkeeper made an incredible save!",
"The central bank raised interest rates.",
"The new smartphone features a revolutionary camera.",
]
results = classifier.batch_classify(
texts=texts,
choices=["sports", "finance", "technology"]
)
for text, result in zip(texts, results):
print(f"{text} -> {result.prediction} ({result.confidence:.2%})")
Async Usage
import asyncio
from ollama import AsyncClient
from ollama_classifier import OllamaClassifier
async def main():
client = AsyncClient()
classifier = OllamaClassifier(client, model="llama3.2")
# Single classification
result = await classifier.aclassify(
text="The concert was amazing!",
choices=["positive", "negative", "neutral"]
)
# Batch classification (concurrent)
results = await classifier.abatch_classify(
texts=["Text 1", "Text 2", "Text 3"],
choices=["positive", "negative", "neutral"]
)
asyncio.run(main())
API Reference
ClassificationResult
@dataclass
class ClassificationResult:
prediction: str # The predicted choice label
confidence: float # Confidence score (0.0 to 1.0)
probabilities: Dict[str, float] # Probability distribution over all choices
raw_response: Dict # Raw Ollama response for debugging
OllamaClassifier Methods
| Method | Async | Description |
|---|---|---|
generate(text, choices, system_prompt) |
agenerate |
Constrained output only (fastest) |
score(text, choices, system_prompt) |
ascore |
Multi-call evaluation with softmax |
classify(text, choices, system_prompt) |
aclassify |
Full classification with confidence scores |
batch_generate(texts, choices, system_prompt) |
abatch_generate |
Batch constrained output |
batch_score(texts, choices, system_prompt) |
abatch_score |
Batch scoring |
batch_classify(texts, choices, system_prompt) |
abatch_classify |
Batch classification |
Parameters
- text (str): The text to classify
- texts (List[str]): List of texts to classify (batch methods)
- choices (Union[List[str], Dict[str, str]]): Either a list of choice labels, or a dict mapping labels to descriptions
- system_prompt (str | None): Optional custom system prompt
Choosing a Method
| Use Case | Recommended Method |
|---|---|
| Speed is critical, no confidence needed | generate |
| Accurate confidence scores | classify / score |
| Batch processing | batch_classify or batch_score |
| Concurrent processing | Async variants (aclassify, etc.) |
License
MIT License
Development
This project just started! Looking forward to suggestions, issues, and pull requests!
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ollama_classifier-0.2.0.tar.gz.
File metadata
- Download URL: ollama_classifier-0.2.0.tar.gz
- Upload date:
- Size: 6.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4baaebd98a1a3e65199345f6a1614a3ad1eb6c3ff96fbf87aac8a96deffdc6ed
|
|
| MD5 |
cc74c12ff073744d963121dc132da12e
|
|
| BLAKE2b-256 |
e30b9483b51991c9423c05a1110cf94ae1b0fd6e474eb9d04f691c2671003c7c
|
Provenance
The following attestation bundles were made for ollama_classifier-0.2.0.tar.gz:
Publisher:
python-publish.yml on paluigi/ollama-classifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ollama_classifier-0.2.0.tar.gz -
Subject digest:
4baaebd98a1a3e65199345f6a1614a3ad1eb6c3ff96fbf87aac8a96deffdc6ed - Sigstore transparency entry: 1186462350
- Sigstore integration time:
-
Permalink:
paluigi/ollama-classifier@86ee55016c9bbdf8ebb4db35c002cb32bd0a2385 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/paluigi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@86ee55016c9bbdf8ebb4db35c002cb32bd0a2385 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ollama_classifier-0.2.0-py3-none-any.whl.
File metadata
- Download URL: ollama_classifier-0.2.0-py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
155a8827e42ca06fb7415d3e409fbcae15a93a57260dc8c7e641f72eb66541ad
|
|
| MD5 |
490ac5c60fba555301c83a764a86c100
|
|
| BLAKE2b-256 |
f1cff9e61562d06e611a73b7355b2815f67bdb7d08cc6097582947f609f002ad
|
Provenance
The following attestation bundles were made for ollama_classifier-0.2.0-py3-none-any.whl:
Publisher:
python-publish.yml on paluigi/ollama-classifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ollama_classifier-0.2.0-py3-none-any.whl -
Subject digest:
155a8827e42ca06fb7415d3e409fbcae15a93a57260dc8c7e641f72eb66541ad - Sigstore transparency entry: 1186462354
- Sigstore integration time:
-
Permalink:
paluigi/ollama-classifier@86ee55016c9bbdf8ebb4db35c002cb32bd0a2385 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/paluigi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@86ee55016c9bbdf8ebb4db35c002cb32bd0a2385 -
Trigger Event:
release
-
Statement type: