Meterbility SDK for Python — trace LLM agent runs into the local Meterbility store
Project description
meterbility-agent (Python SDK)
The Python counterpart to @meterbility/agent. Wire any Python LLM agent into
Meterbility by capturing one Step per model call. Runs land in the same
~/.meterbility/meterbility.db store the TypeScript SDK, the CLI, and the web UI
read from — so a Python agent shows up in meter list and meter web
immediately, with no separate ingest step.
Install
pip install -e packages/agent-py # core only (stdlib)
pip install -e 'packages/agent-py[anthropic]' # add the Anthropic helper
Requires Python 3.9+. Core has zero runtime dependencies (it uses
sqlite3, hashlib, json, pathlib from the standard library).
Minimal usage
from meterbility_agent import MeterbilityTracer
with MeterbilityTracer(project="my-app", agent="support") as tracer:
step = tracer.start_step(
model="claude-opus-4-7",
system_prompt="you are helpful",
history=[{"role": "user", "content": "hello"}],
)
# ... call your model, then record what it did ...
step.record_message("hi back!").record_tokens(
input=10, output=2, cached_read=0, cache_creation=0
)
step.end()
Then in another terminal:
meter list
meter inspect <run-id>
meter web # see it live alongside any Claude Code / Codex runs
Anthropic shortcut
If you already use the official anthropic Python SDK, wrap the client
once and every messages.create() call is captured automatically:
from anthropic import Anthropic
from meterbility_agent import MeterbilityTracer, trace_anthropic
with MeterbilityTracer(project="my-app", agent="support") as tracer:
client = trace_anthropic(tracer, Anthropic()) # API-compatible wrapper
resp = client.messages.create(
model="claude-opus-4-7",
max_tokens=512,
system="you are helpful",
messages=[{"role": "user", "content": "hello"}],
)
# one Meterbility Step captured per call — including tool_use, tokens, latency.
The wrapped client behaves identically to the underlying Anthropic
client — it returns the same Message object, exposes the same
attributes, and re-raises the same exceptions (recording them as
error outcomes before the throw bubbles).
Multi-step agent loop
For multi-step agents that call tools, drive each step manually:
from meterbility_agent import MeterbilityTracer, tool_call_action
with MeterbilityTracer(project="my-app", agent="rag") as tracer:
history = [{"role": "user", "content": "what's the weather in NYC?"}]
# turn 1: model picks a tool
step1 = tracer.start_step(model="claude-opus-4-7", history=history)
step1.record_action(tool_call_action("weather", {"city": "NYC"}, "tu_1"))
step1.record_tokens(input=120, output=20)
step1.end()
# run the tool yourself ...
tool_result = {"temp_f": 68, "conditions": "clear"}
# turn 2: feed the tool result back, model produces a message
history += [
{"role": "assistant", "content": "[tool_call weather]"},
{"role": "tool", "content": str(tool_result)},
]
step2 = tracer.start_step(model="claude-opus-4-7", history=history)
step2.record_message("It's 68°F and clear in NYC.")
step2.record_tokens(input=150, output=15)
step2.end()
What's captured per step
| Field | Source |
|---|---|
model |
required arg to start_step() |
system_prompt, tool_definitions, history, retrieved_docs |
optional context components (blob-stored, content-addressed) |
action |
record_message() / record_tool_call() / record_action() |
outcome |
record_tool_result() / record_outcome() |
tokens (input / output / cached_read / cache_creation [5m] / cache_creation_1h) |
record_tokens() |
cost_cents |
computed from tokens via the same pricing table the TS side uses |
latency_ms |
wall-clock since start_step(), or explicit via record_tokens(latency_ms=...) |
tags |
step.tag("x") — cost:approx auto-applied for unknown models |
Configuration
| Env var | Effect |
|---|---|
METERBILITY_HOME |
Override the data directory (default ~/.meterbility) |
METERBILITY_REDACT=off |
Disable regex redaction of API keys / bearer tokens / private keys |
Run the tests
cd packages/agent-py
python -m unittest discover -s tests -v
Tests redirect METERBILITY_HOME to a tempdir per test, so they never touch
your real ~/.meterbility store.
Project details
Release history Release notifications | RSS feed
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 meterbility_agent-0.3.1.tar.gz.
File metadata
- Download URL: meterbility_agent-0.3.1.tar.gz
- Upload date:
- Size: 60.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4df6e60c26e72b7be2a7a00bb99b04573b8aac24d3c07ec127021d1a63c09215
|
|
| MD5 |
7c3e6534cd0c8f742913e3b14046fc43
|
|
| BLAKE2b-256 |
8fe89f459443e3eeb543c50692a743b63685213dae788e2b3e420e8c680f9b54
|
Provenance
The following attestation bundles were made for meterbility_agent-0.3.1.tar.gz:
Publisher:
publish-pypi.yml on HoneycombHairDevelopers/Meterbility
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meterbility_agent-0.3.1.tar.gz -
Subject digest:
4df6e60c26e72b7be2a7a00bb99b04573b8aac24d3c07ec127021d1a63c09215 - Sigstore transparency entry: 2016034526
- Sigstore integration time:
-
Permalink:
HoneycombHairDevelopers/Meterbility@095022594803a913a0df5c8673e6495af92b4725 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/HoneycombHairDevelopers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@095022594803a913a0df5c8673e6495af92b4725 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file meterbility_agent-0.3.1-py3-none-any.whl.
File metadata
- Download URL: meterbility_agent-0.3.1-py3-none-any.whl
- Upload date:
- Size: 30.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e35b996de8c75803bcc9f1c6240877e281849835dadb21566c174ab249c8887
|
|
| MD5 |
289b7ba61bbfc0c53b5998309aa77569
|
|
| BLAKE2b-256 |
d0c6a0f7caf514b1aefa58dbbea090c1f3e6d0ee12822dfc071b1cee1206f72b
|
Provenance
The following attestation bundles were made for meterbility_agent-0.3.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on HoneycombHairDevelopers/Meterbility
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meterbility_agent-0.3.1-py3-none-any.whl -
Subject digest:
7e35b996de8c75803bcc9f1c6240877e281849835dadb21566c174ab249c8887 - Sigstore transparency entry: 2016034591
- Sigstore integration time:
-
Permalink:
HoneycombHairDevelopers/Meterbility@095022594803a913a0df5c8673e6495af92b4725 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/HoneycombHairDevelopers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@095022594803a913a0df5c8673e6495af92b4725 -
Trigger Event:
workflow_dispatch
-
Statement type: