opentine v0.8.0: model-agnostic provenance, priced after the fact
opentine 0.8.0 is the Model-Agnostic Core release. A run now records provider, model, and usage as opaque provenance, then applies pricing as a separate, post-hoc operation. Capture and accounting can evolve independently without making the provenance kernel depend on a provider catalog.
Release-status update, October 9, 2026: v0.9.1 is now published. The catalog work described after v0.8.0 is shipped history. Read the current release post and upgrade guide.
The release is additive at the storage boundary. Portable *.tine artifacts remain format v2, repository objects remain format v3, and data written by versions 0.3.0 through 0.7.2 remains readable.
Provider is recorded, not interpreted
Every step can now record its provider alongside its model and usage. OpenTelemetry imports populate that field from gen_ai.system or gen_ai.provider.name, so the source identity survives even when a run enters opentine through telemetry rather than a bundled adapter.
Provider is still just recorded content. Integrity verification, forking, diffing, and replay do not branch on its value. Pre-0.8 artifacts load with an empty provider and re-serialize byte-identically, so adding the field does not rewrite existing history.
The provider also appears in JSON step views and field-level diffs. That makes it possible to distinguish two identically named models served through different providers without turning either provider into part of the core's behavior.
Price a run after capture
tine cost and the new tine price answer deliberately different questions:
tine cost result.tine
tine price result.tine
tine price result.tine --at 2026-08-22 --json
tine cost sums the cost recorded when the run was captured. tine price reads the recorded provider, model, usage, and timestamps, then recomputes a report from the signed catalog without changing the artifact.
That distinction matters for imported traces, local records, and catalog corrections. An uncarded model, an absent provider, or missing usage reports unknown; opentine does not turn incomplete billing evidence into a fabricated zero.
Pricing can also be applied before an imported trace is first written:
tine import trace.json \
--format otel-json \
--price \
--save imported.tine
The imported events receive their catalog-backed billing record before they enter the content-addressed store. Existing stored events are not rewritten.
Pricing now understands time windows
The signed catalog advances to opentine-pricing/2, adding UTC peak and off-peak windows with weekday or weekend scope. The billing date selects the applicable card; the step timestamp selects the rate window.
This restores exact catalog pricing for DeepSeek V4 after its billing moved to a time-of-day schedule that the earlier schema could not express. Version 1 catalogs and user overlays still load, and the other existing cards retain their behavior.
Thirty provider names, including local servers
The no-code model path introduced in 0.7 expands from 16 to 30 provider names. Local OpenAI-compatible servers are now directly selectable at their conventional loopback endpoints:
tine run --model vllm --prompt "Review this patch"
tine run --model lmstudio --prompt "Explain this repository"
tine run --model llamacpp --prompt "Summarize the run"
The shipped presets cover vLLM, LM Studio, SGLang, TGI, LiteLLM, MLX-LM, NVIDIA NIM, TensorRT-LLM, KoboldCpp, Jan, LocalAI, Unsloth, and llama.cpp. Concrete local runtimes are recorded as unmetered by default; LiteLLM conservatively reports unknown because it may proxy paid backends.
Adapters remain an optional capture convenience. The OpenTelemetry importer is the universal model-agnostic on-ramp: it can preserve provider, model, usage, and trace content without importing a provider SDK or requiring a matching rate card.
The compatibility promise stays narrow
Version 0.8 does not bump either stored format. The release gate covers artifacts and repositories from 0.3.0 through 0.7.2, and the existing integrity digests and signatures of stored data do not change.
That is the architectural point of the release: opentine can recognize more capture sources and calculate more accurate costs while the operations that make a run durable—verify, fork, diff, and replay—remain provider-neutral.
Install opentine 0.8.0 from PyPI, read the official v0.8.0 changelog, and inspect the tagged source for the full release.