Accurate LLM usage & cost tracking for Python backends (FastAPI-native)
Project description
llm-meter 📊
Accurate LLM usage & cost tracking for Python backends.
llm-meter solves the "black box" of LLM costs by providing framework-native (FastAPI) instrumentation that attributes every token, cent, and millisecond to your business-level concepts (User ID, Feature, Endpoint).
⚡ 15-Minute Setup
# Using uv (recommended)
uv add llm-meter
# or pip
pip install llm-meter
1. Initialize & Instrument
from fastapi import FastAPI
from llm_meter import LLMMeter, FastAPIMiddleware
from openai import OpenAI
# 1. Initialize SDK
meter = LLMMeter(
storage_url="sqlite+aiosqlite:///llm_usage.db",
providers={"openai": {"api_key": "YOUR_KEY"}}
)
app = FastAPI()
# 2. Add Middleton for automatic attribution
app.add_middleware(FastAPIMiddleware, meter=meter)
# 3. Wrap your client
client = meter.wrap_client(OpenAI())
@app.post("/generate")
async def generate(prompt: str):
# This call is automatically tracked and attributed to "/generate"
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return {"text": response.choices[0].message.content}
2. Inspect via CLI
# Get a high-level summary
llm-meter usage summary
# See which endpoint costs the most
llm-meter usage by-endpoint
🎯 Key Features
- Accounting, not Observability: Focuses on cost attribution and usage tracking, not heavy traces or prompt logging.
- FastAPI Native: Middleware handles
request_idand context propagation automatically. - Async-Safe: Powered by
contextvarsto ensure usage is correctly attributed even in complex async workflows. - Proxy-Free: Works via SDK-level instrumentation (no network interception or latency overhead).
- Self-Hosted: You own your data. Supports SQLite (default) and PostgreSQL.
⚠️ v1 Limitations
- Supports OpenAI and Azure OpenAI.
- Batch token tracking (Streaming support coming in v1.1).
- No web UI (everything is available via CLI or SQL).
🧪 Testing, Linting & Type Checks
To run all tests and check coverage:
uv run pytest --cov=llm_meter --cov-report=term-missing
To run linting and formatting checks with Ruff:
uv run ruff check . --fix
uv run ruff format .
To run type checking with Pyright:
uv run pyright
To run all pre-commit hooks manually:
uv run pre-commit run --all-files
These commands help ensure code quality, style, and type safety before committing changes.
🛠 Contributing
We love contributions! Please see CONTRIBUTING.md for details on how to get started.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
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 llm_meter-0.3.3.tar.gz.
File metadata
- Download URL: llm_meter-0.3.3.tar.gz
- Upload date:
- Size: 130.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5362dd40cf42376873e879abcadc53b318bb00375a381854a49b277d231a8503
|
|
| MD5 |
61a080e7207d83a092278d7c67cd5235
|
|
| BLAKE2b-256 |
e03725e60c00c9621ae09aa74ec1228fe5814e9c5d7f0c8e148707f1ff4b4c2e
|
File details
Details for the file llm_meter-0.3.3-py3-none-any.whl.
File metadata
- Download URL: llm_meter-0.3.3-py3-none-any.whl
- Upload date:
- Size: 24.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ead339edefc45e5b28847397f0e333732484f2465f142636015152b6eba3e2cd
|
|
| MD5 |
337a5a239fe1cac1518108e07fb7d6d4
|
|
| BLAKE2b-256 |
f7c90a8181002448b6a5a9304d632271847c5fa9eda6501efca756d2ac400a39
|