OpenInference Ollama Instrumentation
Python auto-instrumentation library for the Ollama Python client.
The traces emitted by this instrumentation are fully OpenTelemetry compatible and can be sent to an OpenTelemetry collector for viewing, such as Arize Phoenix or Arize AX.
What is instrumented
chat calls made through ollama.chat, ollama.Client.chat, and ollama.AsyncClient.chat are exported as OpenInference LLM spans (named Chat and AsyncChat respectively), capturing:
- Input and output messages (
llm.input_messages.*,llm.output_messages.*), including tool calls - Streaming (
stream=True): the span finishes when the stream is exhausted, fails, or is abandoned, with the output message and token counts reconstructed from the accumulated chunks - Tool definitions as
llm.tools.N.tool.json_schema— plain Python functions passed viatools=[...]are converted to their JSON schemas llm.provider(ollama) andllm.model_name(recorded from the request as well, so errored calls still carry the model)- Token counts:
prompt_eval_count→llm.token_count.prompt,eval_count→llm.token_count.completion, with the total derived when both are present llm.invocation_parameters(request options other thanmessages,model, andtools)- Errors: exceptions set the span status to
ERRORand are recorded as span events
Not currently instrumented: generate, embed/embeddings, and other client methods.
[!NOTE] Call
OllamaInstrumentor().instrument()before making chat calls, and invoke chat viaimport ollama; ollama.chat(...)or aClient/AsyncClientinstance. A reference captured before instrumentation (e.g.from ollama import chatat import time) keeps the uninstrumented function and produces no spans. To be captured on the span,toolsmust be a list or tuple (not a generator).
Context attributes (session, user, metadata, tags via using_attributes) propagate onto spans, and sensitive data can be masked with a TraceConfig, e.g. OllamaInstrumentor().instrument(tracer_provider=tracer_provider, config=TraceConfig(hide_inputs=True)). Calls made inside with suppress_tracing(): are not traced.
Installation
pip install openinference-instrumentation-ollama
PyPI package: openinference-instrumentation-ollama
Requires ollama >= 0.4.0.
Quickstart
Install packages needed for this demonstration.
pip install openinference-instrumentation-ollama ollama arize-phoenix opentelemetry-sdk opentelemetry-exporter-otlp
Install and start the Ollama server (pip install ollama installs only the client), then pull a model. The server listens on http://localhost:11434 by default.
ollama pull llama3.2
Start Phoenix in the background as a collector. By default, it listens on http://localhost:6006. (Phoenix does not send data over the internet. It only operates locally on your machine.)
phoenix serve
Set up OllamaInstrumentor to trace your application and send the traces to Phoenix.
from openinference.instrumentation.ollama import OllamaInstrumentor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
endpoint = "http://127.0.0.1:6006/v1/traces"
tracer_provider = TracerProvider()
tracer_provider.add_span_processor(SimpleSpanProcessor(OTLPSpanExporter(endpoint)))
OllamaInstrumentor().instrument(tracer_provider=tracer_provider)
Run a chat completion against the locally running Ollama server.
import ollama
response = ollama.chat(
model="llama3.2",
messages=[{"role": "user", "content": "Why is the sky blue?"}],
)
print(response.message.content)
Now view your traces in the Phoenix UI at http://localhost:6006.
Examples
The examples/ directory contains runnable scripts. They require a running Phoenix and Ollama server, read the model from the OLLAMA_MODEL environment variable (default llama3.2), and send traces to a Phoenix project named ollama-examples.
pip install -r examples/requirements.txt
OLLAMA_MODEL=llama3.2 python examples/chat.py
| Example | Description |
|---|---|
chat.py |
A basic chat completion |
streaming_and_tools.py |
Streaming with session attributes, and tool calling with a plain Python function |
Development
From the python/ directory: tox run -e test-ollama runs the tests, and tox run -e ruff-mypy-test-ollama runs all checks.
More Info
Metadata
Release files for openinference-instrumentation-ollama 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openinference_instrumentation_ollama-0.1.9.tar.gz | 14.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openinference_instrumentation_ollama-0.1.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 34.3 kB
Release files / openinference_instrumentation_ollama-0.1.9.tar.gz
| Download URL | openinference_instrumentation_ollama-0.1.9.tar.gz |
|---|---|
| Size | 14.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9a0691ab949edec71861ec365fbc1e12530d954304e2690d4d2a0fe55bee774b
|
|
BLAKE2b-256 checksum How to use checksums |
a0b12732fea5ec56aa67e66ec5ac80f53460979a3454481d955b62516c54fc24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.
Transparency logRelease files / openinference_instrumentation_ollama-0.1.9-py3-none-any.whl
| Download URL | openinference_instrumentation_ollama-0.1.9-py3-none-any.whl |
|---|---|
| Size | 19.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aa308d1b523632b2deb20208f4a8071de4d80a2987e31af70b14c841c6116036
|
|
BLAKE2b-256 checksum How to use checksums |
e4470f5c4f8f7a80d30cfc0abc1d6e0bd05fe6cd7d938d1763fa4d870efe02aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.
Transparency log