kostlens
Track every AI call your app makes — tokens, cost, latency, and the tags that matter (feature, end user) — with wrappers designed so they can't break your app.
Part of KostLens, the financial layer for your AI usage.
Install
pip install kostlens
Quickstart (2 lines)
from openai import OpenAI
from kostlens import KostLens, wrap_openai
kl = KostLens(os.environ["KOSTLENS_KEY"])
client = wrap_openai(OpenAI(), kl, tags={"feature": "chat"})
# Use `client` exactly as before. Streaming included.
Also available: wrap_anthropic and wrap_google_genai. Any OpenAI-compatible
API (Groq, OpenRouter, DeepSeek, Kimi…) works through wrap_openai — pass
provider="deepseek" so pricing uses the honest vendor label.
Async clients (AsyncOpenAI, AsyncAnthropic) are supported too — wrap them
the same way and await as usual.
Tag what matters
client = wrap_openai(OpenAI(), kl, tags={
"feature": "summarize",
"endUserId": user.id, # camelCase — reserved key
})
Tag keys travel verbatim: use endUserId, not end_user_id. A snake_case
key is stored as a plain custom tag and the Customers page stays empty.
endUserId powers cost-per-customer; feature powers cost-per-feature.
The sacred rule
The SDK is designed so it can never break the host app. track() is
non-blocking (the HTTP call happens on a background daemon thread), network
failures and KostLens outages degrade to "some events are lost" — never to an
exception in your request path. Events are batched, retried with backoff on
transient failures, and dropped (with an on_error callback) when permanently
rejected.
Options
KostLens(
"kl_live_…",
"https://ingest.kostlens.com", # default; override for self-hosted
flush_interval=5.0,
max_batch_size=100,
max_buffer_size=5000,
on_error=lambda err: logging.warning("kostlens: %s", err),
)
Call kl.shutdown() before a short-lived process exits to flush what is
buffered (it is also registered with atexit).
Docs
Full documentation: kostlens.com/docs
MIT © KostLens
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 kostlens-0.1.0.tar.gz.
File metadata
- Download URL: kostlens-0.1.0.tar.gz
- Upload date:
- Size: 24.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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 |
b61a2855e59f4a769c7af9984eec3b171695b6a9e6d7e8cc431852faf6531657
|
|
| MD5 |
5ebd18b68c54bfb2eab437dca64933c8
|
|
| BLAKE2b-256 |
31867cf8ed9a505c72e607c54c7de811021063ca70f0cb6a4e51b730a22e1601
|
File details
Details for the file kostlens-0.1.0-py3-none-any.whl.
File metadata
- Download URL: kostlens-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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 |
4e35bc78e07c27fc96815c96f92a4265667fd8169d24c24d334b49265b563a26
|
|
| MD5 |
696e54e381556f54e7213461449ebc3b
|
|
| BLAKE2b-256 |
fd8ad7719c22b5408cb40b603e153755d35905474fb734ae42daad652b36858f
|