Skip to main content

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" or sink="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

stepcost-0.3.0.tar.gz (50.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stepcost-0.3.0-py3-none-any.whl (46.2 kB view details)

Uploaded Python 3

File details

Details for the file stepcost-0.3.0.tar.gz.

File metadata

  • Download URL: stepcost-0.3.0.tar.gz
  • Upload date:
  • Size: 50.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for stepcost-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e634f05b5cf2e218647afb69ea48bde1963b119637f92e2642fe0001f32e420a
MD5 1301b80a540b838daf684c83568d101d
BLAKE2b-256 a1d799d506cfbbf5cc1765b50a8dbfb715ce56da17065e00d516fd4178c5ffd3

See more details on using hashes here.

File details

Details for the file stepcost-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: stepcost-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 46.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for stepcost-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 acb3cfa8d3cae32be7a1d8cb520332571f3c2a4efe2da2cb32cdc3a0bc7cd277
MD5 cb1cfa04a59000586d2b92dcefa016e2
BLAKE2b-256 52abcb61d124815ae4daf325508d793babd17983f6f4445765e139d459a16015

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page