opentine v0.20.0: record your program’s model calls
You should not need to rewrite a program just to retain the model calls it makes. v0.20.0 adds tine record: a command wrapper that records supported model traffic through a localhost reverse proxy, without an opentine SDK hook or harness.
python -m pip install --upgrade "opentine==0.20.0"
tine record --save run.tine -- python agent.py
tine show run.tine
tine price run.tine
Here, agent.py is your existing program. It still chooses its model and sends its requests. The wrapper changes supported provider base URLs in the child environment, forwards calls to the previously configured upstream or provider default, and streams responses back—including SSE.
A model-call artifact
Each intercepted call becomes a model step with provider, model, request, reply text, duration, and normalized token usage. Existing adapter usage readers supply the normalization, so the saved run can be priced afterward.
The default save location is .tine_runs/<id>.tine. Use --save PATH for an explicit destination and --force to replace it. The wrapper returns the child's exit code. An unreachable upstream produces a 502 response for the child and an error step in the run.
What the proxy does—and does not—see
The supported environment variables are OPENAI_BASE_URL, OPENAI_API_BASE, ANTHROPIC_BASE_URL, DEEPSEEK_BASE_URL, and XAI_BASE_URL.
A program must honor those variables for its calls to pass through the proxy. Hard-coded endpoints, unsupported routing, and traffic that bypasses the proxy are outside the capture path. This is not a sandbox, full network capture, or a record of every tool invocation and file change.
Headers are never captured, so Authorization and x-api-key headers do not enter the run through header capture. Bodies pass through the usual redaction. That is not a blanket promise that an artifact contains no secrets: inspect request bodies, responses, and command arguments before sharing.
Reliability fixes included
v0.20.0 also includes the v0.19.1 Windows fixes. Concurrent identical-run saves retry transient sharing violations, while lasting denials still fail. Harness duration-budget timeouts count at least the full budget, preventing coarse timing from turning a duration breach into a bare timeout error.
Portable .tine v2 and repository v3 formats remain unchanged, with Python 3.11–3.14 support. Agent Trace export, Entire checkpoint import, signing, and trust-root verification remain separate tools in the same workflow.
Read the record command guide, upgrade guide, and release status. The official GitHub release, PyPI package, and tagged changelog provide the release record.