Python SDK for the AICostManager API
Project description
AICostManager Python SDK
The AICostManager SDK reports AI usage to AICostManager, helping you track costs across providers.
Prerequisites
- Create a free account at aicostmanager.com and generate an API key.
- Export the key as
AICM_API_KEYor pass it directly to the client or tracker.
Installation
uv (recommended)
uv pip install aicostmanager
# or add to an existing project
uv add aicostmanager
pip (fallback)
pip install aicostmanager
Quick start
Identify the API and service
Every usage event is tied to two identifiers:
- api_id – the API being called (for example, the OpenAI Chat API)
- service_key – the specific model or service within that API
- Visit the service lookup page and
open the APIs tab. Copy the
api_idfor the API you are using, e.g.openai_chat. - Switch to the Services tab on the same page and copy the full
service_keyfor your model, e.g.openai::gpt-5-mini.
Track usage
from aicostmanager import Tracker
service_key = "openai::gpt-5-mini" # copied from the Services tab
with Tracker() as tracker:
tracker.track(service_key, {
"input_tokens": 10,
"output_tokens": 20,
})
Using with Tracker() ensures the background delivery queue is flushed before
the program exits.
Configuration values are read from an AICM.INI file. See
config.md for the complete list of available settings and
their defaults.
LLM wrappers
Wrap popular LLM SDK clients to record usage automatically without calling
track manually:
from aicostmanager import OpenAIChatWrapper
from openai import OpenAI
client = OpenAI()
wrapper = OpenAIChatWrapper(client)
resp = wrapper.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Say hello"}],
)
print(resp.choices[0].message.content)
wrapper.close() # optional for immediate delivery; required for queued delivery
See LLM wrappers for the full list of supported providers and advanced usage.
Choosing a delivery strategy
Tracker supports multiple delivery components via DeliveryType:
- Immediate – send each record synchronously. Ideal for simple scripts or tests.
- Persistent queue (
DeliveryType.PERSISTENT_QUEUE) – durable SQLite-backed queue for reliability across restarts.
Use the persistent queue for long-running services where losing usage data is unacceptable and immediate delivery when every call can block on the API. See Persistent Delivery and the Tracker guide for details.
Interpreting /track responses
The /track endpoint now distinguishes between ingestion and background
processing. Immediate delivery still returns the first result item, but the
payload may not include cost_events right away. Instead, check the
status field to understand how the event will be processed:
| Status | Meaning |
|---|---|
queued |
The service key is recognised and the event has been queued for processing. |
completed |
Processing finished synchronously (legacy servers may still return cost events immediately). |
error |
The event failed processing and includes descriptive errors. |
service_key_unknown |
The service key is not recognised; the event is quarantined for review. |
Unknown services now produce a friendly error message, for example:
{
"response_id": "resp-456",
"status": "service_key_unknown",
"errors": [
"Service key 'unknown::service' is not recognized. Event queued for review."
]
}
Existing integrations should branch on result.status and treat
service_key_unknown differently from error. See the
tracker documentation for detailed
guidance and migration tips.
For real-time insight into the persistent queue, run the queue-monitor
command against the SQLite database created by PersistentDelivery:
uv run queue-monitor ~/.cache/aicostmanager/delivery_queue.db
Tracking in different environments
Python scripts
Use the context manager shown above to automatically flush the queue.
Django
# myapp/apps.py
from django.apps import AppConfig
from aicostmanager import Tracker
tracker = Tracker()
class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
import atexit
atexit.register(tracker.close)
# myapp/views.py
from .apps import tracker
def my_view(request):
tracker.track("openai::gpt-4o-mini", {"input_tokens": 10})
...
For a full setup guide, see Django integration guide.
FastAPI
from fastapi import FastAPI
from aicostmanager import Tracker
app = FastAPI()
@app.on_event("startup")
async def startup() -> None:
app.state.tracker = Tracker()
@app.on_event("shutdown")
def shutdown() -> None:
app.state.tracker.close()
For a full setup guide, see FastAPI integration guide.
Streamlit
import streamlit as st
from aicostmanager import Tracker
import atexit
@st.cache_resource
def get_tracker():
tracker = Tracker()
atexit.register(tracker.close)
return tracker
tracker = get_tracker()
if st.button("Generate"):
tracker.track("openai::gpt-4o-mini", {"input_tokens": 10})
For a full setup guide, see Streamlit integration guide.
Celery
from celery import Celery
from aicostmanager import Tracker
from celery.signals import worker_shutdown
app = Celery("proj")
tracker = Tracker()
@app.task
def do_work():
tracker.track("openai::gpt-4o-mini", {"input_tokens": 10})
@worker_shutdown.connect
def close_tracker(**_):
tracker.close()
For very short tasks, use with Tracker() as tracker: inside the task
to ensure flushing.
More documentation
Project details
Release history Release notifications | RSS feed
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 aicostmanager-0.2.1.tar.gz.
File metadata
- Download URL: aicostmanager-0.2.1.tar.gz
- Upload date:
- Size: 77.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6efa4a8ccfd7a875c803d4e24bf128e858cf5b84a38e106c4453749b84c52724
|
|
| MD5 |
50c3f24fab1d023ea63640a0bb7b7988
|
|
| BLAKE2b-256 |
f9567d698c3fae3a6c397e1cea522a064c43931b24c1b4efa8677c45b52bb9e2
|
File details
Details for the file aicostmanager-0.2.1-py3-none-any.whl.
File metadata
- Download URL: aicostmanager-0.2.1-py3-none-any.whl
- Upload date:
- Size: 56.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
505e3726cc7af22e07b41b35762050d7ae801a4b1a7170893ac100e80aedaf8a
|
|
| MD5 |
c232d22bb40978aff8c293bdc4efa457
|
|
| BLAKE2b-256 |
039500c1d277387079af3ad8005e3d2af79441aaa6e68e04073f21153dfe40ad
|