FinOps for LLM agents — unit economics and cost accountability in the developer workflow
Project description
stepcost (Python SDK)
FinOps for LLM agents — a typed, priced cost graph for every agent step. See
../../SPEC.md for the product and technical design.
Install
pip install stepcost # from PyPI (or: pip install -e . from a clone)
pip install -e ".[dev]" # + pytest, ruff
Requires Python ≥ 3.11. Runtime deps: pydantic (only).
Quickstart (no API key, $0)
python examples/quickstart.py
stepcost report ~/.stepcost/quickstart.db
examples/quickstart.py instruments a 3-step agent (plan → retrieve → execute)
with simulated usage and writes a priced cost graph to SQLite. stepcost report
renders the per-step tree, by-step / by-kind / by-customer rollups, and waste
flags — no spend, no network.
Instrument your agent
from stepcost import StepCost, agent_step, llm_call
cc = StepCost(project="my-app", sink="sqlite:///~/.stepcost/my-app.db")
with cc.trace(feature_id="chat", customer_id="acme") as trace:
with agent_step("answer"), llm_call(model="gpt-4o-mini", provider="openai") as call:
resp = openai_client.chat.completions.create(...)
call.record(resp) # invoice-safe token + $ extraction
print(trace.total_usd, trace.by_step) # also .by_kind
call.record(resp)extracts usage from OpenAI (Chat Completions, Responses API, embeddings) and Anthropic responses — cached / reasoning tokens and 5m- vs 1h-TTL cache writes split correctly, no double-count. Unrecognized usage shapes raise instead of silently recording $0.- No extractor for your provider? Use
record_usage(input_tokens=…, output_tokens=…, embedding_tokens=…). - Sinks:
sink="stdout"orsink="sqlite:///path.db". - Safe by construction: spans persist at trace exit and process exit (no manual
flush()needed), sink failures re-queue instead of dropping spans, and concurrent asyncio tasks under one trace parent their spans correctly. - Models missing from the price table trigger a runtime warning and an
"unpriced spans" section in
stepcost report— never a silent $0.
Report CLI
stepcost report <db> # account summary: by feature/customer/kind, top traces, waste
stepcost report <db> --trace <id> # one trace's cost tree (per-node tokens + $)
stepcost report <db> --json # machine-readable
Privacy
Metadata-only by default (PayloadCapture.NONE): token counts, model, and your
business dimensions — never prompt/response content. Fully offline; SQLite stays
local.
Develop
pytest # 50 tests
ruff check stepcost tests scripts
python scripts/bench_overhead.py # p99 span-emit overhead (<5ms gate)
Project details
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 stepcost-0.3.2.tar.gz.
File metadata
- Download URL: stepcost-0.3.2.tar.gz
- Upload date:
- Size: 51.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52cfcc45d4ddbf584008734236f94cbb7a87dbfde98847589299a8824cc3da11
|
|
| MD5 |
0af0f8b403bdabc5a97636a0f96641c0
|
|
| BLAKE2b-256 |
2ceb7a34ffc677361f7549211aaf26cd0e1d49711831c035ff403b31e51b9ca1
|
File details
Details for the file stepcost-0.3.2-py3-none-any.whl.
File metadata
- Download URL: stepcost-0.3.2-py3-none-any.whl
- Upload date:
- Size: 47.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18a349d7f3ac90d68e19b045e3956f582b79cfd9981fe6156ce0c35b0a0a2211
|
|
| MD5 |
b272fec11dfe6f0e07af3c9e95894dec
|
|
| BLAKE2b-256 |
aa9588b25fa1b37b09b8ea1b993ef9f0bb5238a4d1596d9e9751137c0f88b448
|