Reference · v0.44.0
OpenTine documentation
From the pinned CLI source. Read upstream.
Current format policy: Portable .tine files default to v5 (since 0.42). --for-legacy writes v4. The .tine/ repository format is v3. tine evidence export writes v4.
How it works
Every run becomes a content-addressed graph — model steps, tool calls, and
outcomes, each named by digest. Fork from any step to retry a different way;
tine replay --verify re-derives the run and proves it reproduces (digests
intact, no structural drift) — all without losing provenance.
The model-agnostic core
OpenTine records (provider, model, usage) on every step as opaque data. It
does not have to recognize the provider, the model id, or the shape of the usage
dictionary to store them, and nothing in the kernel — verify, fork, diff, replay
— reads them. Dollars are applied afterwards, by a separate signed catalog:
tine show run.tine --cost # the cost recorded at capture time
tine show run.tine --price # re-derive it now from (provider, model, usage)
tine show run.tine --price --at 2026-07-15 # …against the catalog effective that day
tine import trace.json --format otel-json --price --save run.tine
tine show --cost (tine cost) sums what was recorded when the run happened;
tine show --price (tine price) computes
the cost post-hoc from the record and writes nothing, so an imported or uncosted
run can be priced too, and a step no card covers is reported unknown rather
than as free. A provider OpenTine has never heard of still produces a complete,
verifiable, diffable, forkable run — and becomes priceable the day someone
writes a card for it, with no new release and no adapter.
So opentine.models is a capture convenience, not the boundary of what
OpenTine supports: it is there so a first run costs one command, not because a
run has to come from it. The universal, model-agnostic on-ramp is
OpenTelemetry GenAI — tine import --format otel-json needs no adapter, no key,
and no rate card, and prices the result afterwards if you ask it to. See
CAPTURE.md.