modelmri-record
Record what your agent actually did — LLM calls, tool calls, subagents, errors — and look at it on a timeline instead of scrolling logs.
pip install modelmri-record
Stdlib only. No torch, no numpy, no SDK pins. Instrumenting an agent shouldn't cost you a 2.5 GB install.
Use
from modelmri_record import trace, step
with trace("fix-failing-tests"):
step("llm_call", name="plan", input=prompt, output=answer,
duration_ms=1200, tokens_in=900, tokens_out=200)
with step("subagent", name="test-runner"):
step("tool_call", name="pytest", input="-q", output="3 failed")
Nesting is automatic — a step used as a context manager becomes the parent of
everything recorded inside it, and its duration is measured for you.
Auto-instrument an SDK instead:
from modelmri_record import instrument_anthropic
instrument_anthropic() # every Messages.create is now an llm_call step
Where traces go
POSTed to a running ModelMRI viewer on http://127.0.0.1:5900. If nothing is
listening, they're written to ./modelmri-traces/*.json to import later — so
you can record on a box that has no viewer and look at it somewhere else.
To view them: pip install modelmri && modelmri serve.
Credentials are redacted by default
Agent prompts routinely contain the key the agent was handed. A recorder that writes those to disk verbatim is a liability dressed as an observability feature, so redaction is on unless you switch it off:
with trace("run"): # default scrubber
with trace("run", redact=my_function) # your own str -> str
with trace("run", redact=False) # verbatim, deliberately
Covered: sk-…, hf_…, pypi-…, ghp_…/github_pat_…, xoxb-…, Google
AIza…, AWS key ids, Bearer …, and whole PEM private-key blocks.
Patterns are deliberately narrow — known credential shapes, not "anything high-entropy". A redactor that eats hashes and UUIDs makes traces useless, and a useless trace gets the feature turned off, which protects nobody. Add your own shapes:
from modelmri_record.redact import make_redactor
red = make_redactor([r"ACME-[0-9]{6}"])
It will not take down your app
Recording is best-effort by contract. If the viewer is unreachable, the disk is read-only, or the payload won't serialise, it gives up quietly. A tracing library that can raise is one nobody leaves switched on.
Traces still open when the process exits are flushed by an atexit hook —
a crash or a SIGTERM is exactly the run you most wanted to look at.
Licence
MIT. Part of ModelMRI.
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 modelmri_record-0.1.1.tar.gz.
File metadata
- Download URL: modelmri_record-0.1.1.tar.gz
- Upload date:
- Size: 10.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f47d7107ed2775f4d87d3feb8734f2b8eac52d9cf8430d811718fc6f7b619c3
|
|
| MD5 |
9da760dc96144c7a91b075a6d5529ae3
|
|
| BLAKE2b-256 |
638152788bc7edb0718fd398bd5419b94d4867e9a20c077ea4095e9f9075f42d
|
File details
Details for the file modelmri_record-0.1.1-py3-none-any.whl.
File metadata
- Download URL: modelmri_record-0.1.1-py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96961703fb623328beae9e99da61b036d0e929eeef7fbea533415378ebdc7213
|
|
| MD5 |
51aa08037ce9ebc774dad10526508469
|
|
| BLAKE2b-256 |
586754e8f5ba6a9d8c22c411afca508abade24bc40875bdc5d5e22540ba47413
|