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.1.tar.gz (51.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.1-py3-none-any.whl (46.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: stepcost-0.3.1.tar.gz
  • Upload date:
  • Size: 51.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.1.tar.gz
Algorithm Hash digest
SHA256 e28c22ba36c30f582f6b09bb97fd3d410be155493dc2582fb319b51901826cfa
MD5 f03e22c2d7ccebbdb9ba220c958c30a4
BLAKE2b-256 88cc8987ce017760621ae5f181ee855bdbf321200e7554050ccf324f024f9f05

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stepcost-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 46.8 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9e3897d5cd7e9118315053cd385a7425f3d00f8df9700aad05be1b22c8b8376a
MD5 c2561e5f25e29f9261a9059517f78a3c
BLAKE2b-256 1a1ec703c9d5db224fa19660974e6ccf83f6253fde046ea8dc5ede2193575b77

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