Python SDK for capturing LLM traffic and ingesting envelopes into Ai Token Tracker
Project description
Ai Token Tracker Python SDK
ai-token-tracker captures outbound LLM traffic and posts ingest envelopes to Ai Token Tracker.
Supports:
- Automatic HTTP interception (
requests,httpxsync/async) - SDK wrapper integration (
begin_llm_callscope) - Diagnostics fallback (metadata-only safety net)
Requirements
- Python 3.10+
Installation
pip install ai-token-tracker
Optional extras:
pip install ai-token-tracker[requests]
pip install ai-token-tracker[httpx]
pip install ai-token-tracker[all]
Defaults
enable_auto_interception=Trueenable_diagnostics_fallback=True
Quick Start (Plain Script)
from ai_token_tracker import (
AiTokenTrackerIngestionClient,
AiTokenTrackerOptions,
AiTokenTrackerSdkClient,
)
ingestion = AiTokenTrackerIngestionClient(
AiTokenTrackerOptions(auth_token="atk_your_key")
)
sdk = AiTokenTrackerSdkClient(ingestion)
scope = sdk.begin_llm_call(
request={"model": "gpt-4.1-mini", "input": "hello"},
custom_filters={"workflow": "quickstart"},
provider_hint="anthropic",
)
try:
provider_response = {"id": "resp_123", "output": [{"type": "output_text", "text": "hi"}]}
scope.complete(provider_response, status_code=200)
except Exception as ex:
scope.fail(ex, status_code=500)
raise
finally:
ingestion.close()
Automatic HTTP Interception
Interception is explicit install + option-gated:
import requests
from ai_token_tracker import (
AiTokenTrackerIngestionClient,
AiTokenTrackerOptions,
install_http_interception,
)
client = AiTokenTrackerIngestionClient(
AiTokenTrackerOptions(
auth_token="atk_your_key",
enable_auto_interception=True,
)
)
install_http_interception(client)
# Classified request is captured and ingested automatically.
requests.post(
"https://api.openai.com/v1/responses",
headers={"Authorization": "Bearer sk_test"},
json={"model": "gpt-4.1-mini", "input": "hello"},
timeout=10,
)
client.close() # unpatches interceptors + shuts down background worker
Scoped Custom Filters For Automatic Interception
Use interception scope to attach custom filters without wrapper integration:
import requests
from ai_token_tracker import (
AiTokenTrackerIngestionClient,
AiTokenTrackerInterceptionScope,
AiTokenTrackerOptions,
install_http_interception,
)
client = AiTokenTrackerIngestionClient(
AiTokenTrackerOptions(auth_token="atk_your_key", enable_auto_interception=True)
)
install_http_interception(client)
scope = AiTokenTrackerInterceptionScope.create({"workflow": "social_post_generation"})
scope.add_custom_filters({"job_id": "job-42", "customer_id": "cust-19"})
scope.open()
try:
requests.post(
"https://api.openai.com/v1/responses",
headers={"Authorization": "Bearer sk_test"},
json={"model": "gpt-4.1-mini", "input": "hello"},
timeout=10,
)
finally:
scope.close()
Always close scope in finally to avoid leaking filters to later calls.
SDK Wrapper Example
from ai_token_tracker import AiTokenTrackerIngestionClient, AiTokenTrackerOptions, AiTokenTrackerSdkClient
ingestion = AiTokenTrackerIngestionClient(AiTokenTrackerOptions(auth_token="atk_your_key"))
tracker = AiTokenTrackerSdkClient(ingestion)
# method defaults to "POST" when omitted
scope = tracker.begin_llm_call(
request={"model": "claude-sonnet-4-6", "max_tokens": 256, "messages": [{"role": "user", "content": "hello"}]},
custom_filters={"tenant": "acme", "job": "summarization"},
provider_hint="anthropic",
)
scope.complete({"id": "msg_123"}, status_code=200)
ingestion.close()
Diagnostics Fallback Setup
Diagnostics fallback is best-effort metadata capture for uncovered traffic.
from ai_token_tracker import AiTokenTrackerIngestionClient, AiTokenTrackerOptions, install_http_interception
client = AiTokenTrackerIngestionClient(
AiTokenTrackerOptions(
auth_token="atk_your_key",
enable_diagnostics_fallback=True,
)
)
install_http_interception(client)
Fallback behavior:
- captures method, url, status, headers
- does not guarantee request/response bodies
- intended for visibility and coverage-gap detection, not full fidelity auditing
FastAPI Example
from contextlib import asynccontextmanager
from fastapi import FastAPI
from ai_token_tracker import (
AiTokenTrackerIngestionClient,
AiTokenTrackerOptions,
AiTokenTrackerSdkClient,
install_http_interception,
)
ingestion = AiTokenTrackerIngestionClient(
AiTokenTrackerOptions(auth_token="atk_your_key", enable_auto_interception=True)
)
tracker = AiTokenTrackerSdkClient(ingestion)
@asynccontextmanager
async def lifespan(app: FastAPI):
install_http_interception(ingestion)
yield
ingestion.close()
app = FastAPI(lifespan=lifespan)
@app.get("/health")
def health() -> dict[str, str]:
return {"status": "ok"}
Background Worker / Job Pipeline Example
from ai_token_tracker import AiTokenTrackerIngestionClient, AiTokenTrackerOptions, AiTokenTrackerSdkClient
ingestion = AiTokenTrackerIngestionClient(AiTokenTrackerOptions(auth_token="atk_your_key"))
tracker = AiTokenTrackerSdkClient(ingestion)
def run_job(job_id: str, prompt: str) -> None:
scope = tracker.begin_llm_call(
request={"model": "gpt-4.1-mini", "input": prompt},
custom_filters={"job_id": job_id, "pipeline": "nightly"},
provider_hint="anthropic",
)
try:
response = {"id": f"resp_{job_id}", "output": [{"type": "output_text", "text": "done"}]}
scope.complete(response)
except Exception as ex:
scope.fail(ex)
raise
run_job("42", "summarize daily usage")
ingestion.close()
Custom Filters Guidance
custom_filters is key/value metadata attached to each envelope:
- keep keys stable (
tenant,workflow,job_id,environment) - keep values low-cardinality when possible
- avoid putting secrets or full prompt bodies in filters
Verification Checklist
- Create client with valid
auth_token. - For interception, set option flag and call
install_http_interception(client). - Send known LLM request (
/v1/responsesor/chat/completions). - Confirm event appears in AI Token Tracker dashboard.
- Confirm app flow still works if ingest is unavailable (tracking paths are non-throwing).
Public API Summary
AiTokenTrackerOptions(auth_token, enable_auto_interception=True, enable_diagnostics_fallback=True)AiTokenTrackerIngestionClient.track(...) -> TrackResultAiTokenTrackerIngestionClient.track_async(...) -> TrackResultAiTokenTrackerIngestionClient.close()AiTokenTrackerInterceptionScope.create(...),open(),close()AiTokenTrackerSdkClient.begin_llm_call(...) -> CallScopeCallScope.complete(...),CallScope.fail(...)CallScope.complete_async(...),CallScope.fail_async(...)install_http_interception(client),uninstall_http_interception(client)
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 ai_token_tracker-0.2.3.tar.gz.
File metadata
- Download URL: ai_token_tracker-0.2.3.tar.gz
- Upload date:
- Size: 17.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17d31ef89d2f019ff0fc48a594ea55d403bfba330bd5bdd33080bdc110f22de3
|
|
| MD5 |
97897b0a8e4dac2255ba1a667cd4aea3
|
|
| BLAKE2b-256 |
ba1b7cb63ec003775ebd78230dbcf9b68fb80487875fa369d60e4743bfaf3b7c
|
File details
Details for the file ai_token_tracker-0.2.3-py3-none-any.whl.
File metadata
- Download URL: ai_token_tracker-0.2.3-py3-none-any.whl
- Upload date:
- Size: 16.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db9a61648c7855d4f6c7866a5cc9c99ee6a762658f258cf37280434e0039e954
|
|
| MD5 |
015858bf477445445e92fa919371d1a2
|
|
| BLAKE2b-256 |
f40f84058f451d4f5b786b8c077e3112268000cd9e66d1cdecde3c5aa0916aeb
|