Skip to main content

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:

  1. Automatic HTTP interception (requests, httpx sync/async)
  2. SDK wrapper integration (begin_llm_call scope)

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=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"},
    additional_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"})

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()

create(...) opens scope automatically. Call close() when you want to end scope early.

SDK Wrapper Example

from ai_token_tracker import AiTokenTrackerIngestionClient, AiTokenTrackerOptions, AiTokenTrackerSdkClient

ingestion = AiTokenTrackerIngestionClient(AiTokenTrackerOptions(auth_token="atk_your_key"))
tracker = AiTokenTrackerSdkClient(ingestion)

scope = tracker.begin_llm_call(
    request={"model": "claude-sonnet-4-6", "max_tokens": 256, "messages": [{"role": "user", "content": "hello"}]},
    additional_custom_filters={"tenant": "acme", "job": "summarization"},
    provider_hint="anthropic",
)

scope.complete({"id": "msg_123"}, status_code=200)
ingestion.close()

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},
        additional_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

additional_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

  1. Create client with valid auth_token.
  2. For interception, set option flag and call install_http_interception(client).
  3. Send known LLM request (/v1/responses or /chat/completions).
  4. Confirm event appears in AI Token Tracker dashboard.
  5. Confirm app flow still works if ingest is unavailable (tracking paths are non-throwing).

Public API Summary

  • AiTokenTrackerOptions(auth_token, enable_auto_interception=True)
  • AiTokenTrackerIngestionClient.track(...) -> TrackResult
  • AiTokenTrackerIngestionClient.track_async(...) -> TrackResult
  • AiTokenTrackerIngestionClient.close()
  • AiTokenTrackerInterceptionScope.create(...), open(), close()
  • AiTokenTrackerSdkClient.begin_llm_call(...) -> CallScope
  • CallScope.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

ai_token_tracker-0.2.6.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ai_token_tracker-0.2.6-py3-none-any.whl (16.1 kB view details)

Uploaded Python 3

File details

Details for the file ai_token_tracker-0.2.6.tar.gz.

File metadata

  • Download URL: ai_token_tracker-0.2.6.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for ai_token_tracker-0.2.6.tar.gz
Algorithm Hash digest
SHA256 1f9d0d2fbca2bf77ea8630c14117d3ee4c1e7ee9f1ae30b8e579f8b83344c957
MD5 3d3a6704c233be30ec7f93dcd91c2732
BLAKE2b-256 bbb6da8e31ecc4b261b9162ac79135f417f254621f67fbc740679586ef285864

See more details on using hashes here.

File details

Details for the file ai_token_tracker-0.2.6-py3-none-any.whl.

File metadata

File hashes

Hashes for ai_token_tracker-0.2.6-py3-none-any.whl
Algorithm Hash digest
SHA256 dba2aca88a8a98c7650d13807983f1db7406f0ed8728cd42c8209e9142fd1fb4
MD5 7108d9b457e3874c1a65d20e69c73d13
BLAKE2b-256 ed55844cd4dbca4e8e85cc25fc9fed426eb36968cac03794dba83dd3a3f169c6

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