Skip to main content

Lightweight API cost tracker for research labs

Project description

Hong Lab AI Cost Tracker

A lightweight Python SDK that transparently tracks LLM API costs. Wrap your existing client with tracker.wrap() — costs are logged automatically.

Supports OpenAI, Google Gemini, Anthropic, and third-party proxies (e.g. apiyihe.org).

Installation

pip install hong-lab-ai-cost

# With specific provider support
pip install "hong-lab-ai-cost[openai]"
pip install "hong-lab-ai-cost[all]"       # OpenAI + Gemini + Anthropic

API Keys (Recommended: Use Environment Variables)

You do NOT need to hardcode API keys in your code. Each provider's SDK automatically reads from environment variables — just export them in your shell or .env file:

# OpenAI (including third-party proxies)
export OPENAI_API_KEY="sk-..."

# Google Gemini
export GOOGLE_API_KEY="..."

# Anthropic
export ANTHROPIC_API_KEY="sk-ant-..."

This way, your code stays clean and your keys are never exposed in source files. The hong-lab-ai-cost SDK does not handle API keys at all — it only wraps the client for cost tracking. Key management is entirely handled by each provider's own SDK.

💡 Tip: Add these exports to your ~/.bashrc, ~/.zshrc, or use a .env file with python-dotenv to load them automatically.

Usage

OpenAI

from openai import OpenAI
from hong_lab_ai_cost import CostTracker

tracker = CostTracker(project="MyProject", user="kyle", email="kyle@aucklanduni.ac.nz")
client = tracker.wrap(OpenAI())  # Reads OPENAI_API_KEY from environment

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Hello!"}],
)

print(tracker.summary())

Google Gemini

from google import genai
from hong_lab_ai_cost import CostTracker

tracker = CostTracker(project="MyProject", user="kyle", email="kyle@aucklanduni.ac.nz")
client = tracker.wrap(genai.Client())  # Reads GOOGLE_API_KEY from environment

response = client.models.generate_content(model="gemini-2.5-flash", contents="Hello!")

Anthropic

import anthropic
from hong_lab_ai_cost import CostTracker

tracker = CostTracker(project="MyProject", user="kyle", email="kyle@aucklanduni.ac.nz")
client = tracker.wrap(anthropic.Anthropic())  # Reads ANTHROPIC_API_KEY from environment

response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}],
)

Third-party Proxy

from openai import OpenAI
from hong_lab_ai_cost import CostTracker

tracker = CostTracker(project="MyProject", user="kyle", email="kyle@aucklanduni.ac.nz")
# OPENAI_API_KEY is read from environment; only base_url needs to be specified
client = tracker.wrap(OpenAI(base_url="https://z.apiyihe.org/v1"))

response = client.chat.completions.create(model="gpt-4o-mini", messages=[...])

Manual Recording

For unsupported providers, record usage manually:

tracker.record(model="llama-3-8b", prompt_tokens=1000, completion_tokens=500)

Configuration

All settings can be provided via constructor arguments, environment variables, or a .cost-tracker.yaml file (priority: constructor > env > yaml > defaults).

Setting Constructor Env Variable Default
Project name project= COST_TRACKER_PROJECT "default"
User name user= COST_TRACKER_USER None
Email email= COST_TRACKER_EMAIL None
Remote API remote_url= COST_TRACKER_REMOTE_URL None (local only)
Storage dir storage_dir= .cost-tracker/

Example .cost-tracker.yaml:

project: DentalVLM
user: kyle
email: kyle@aucklanduni.ac.nz
remote_url: https://api.honglab.dev

Remote Sync

By default, the SDK only saves records locally. To enable automatic upload to a remote server, configure remote_url:

Method 1: Constructor argument

tracker = CostTracker(
    project="MyProject",
    user="kyle",
    email="kyle@aucklanduni.ac.nz",
    remote_url="https://api.honglab.dev",  # Add this to enable upload
)

Method 2: Environment variable

export COST_TRACKER_REMOTE_URL="https://api.honglab.dev"

Method 3: Config file .cost-tracker.yaml

remote_url: https://api.honglab.dev

Records are uploaded to POST {remote_url}/api/v1/usage/batch with X-Lab-User and X-Lab-Email headers. The server validates these against a whitelist.

If the upload fails (network error, server down), the record is kept locally and retried on the next tracker.flush() or at process exit.

License

MIT

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

hong_lab_ai_cost-0.1.2.tar.gz (15.1 kB view details)

Uploaded Source

Built Distribution

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

hong_lab_ai_cost-0.1.2-py3-none-any.whl (15.5 kB view details)

Uploaded Python 3

File details

Details for the file hong_lab_ai_cost-0.1.2.tar.gz.

File metadata

  • Download URL: hong_lab_ai_cost-0.1.2.tar.gz
  • Upload date:
  • Size: 15.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for hong_lab_ai_cost-0.1.2.tar.gz
Algorithm Hash digest
SHA256 9d1c335844e244757a85d0cc0b979f5171245b7193924017005e2a69dabbe98c
MD5 ae583e2bdb82c1d9348766a3f55a51c0
BLAKE2b-256 6b997a055e079858e8f0f96a226d113741d1f58cb7b7543d38472d5ed374f942

See more details on using hashes here.

File details

Details for the file hong_lab_ai_cost-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for hong_lab_ai_cost-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 05d6172c08a380f9ee6a15df43570a0a8ac44ca4d9494d74479a164c25a1b478
MD5 561f71c5fc806acfc8203bc4e7c6b07b
BLAKE2b-256 6279fdb2c4f41e92d1a1beb9f349ce15ce4a635577f3c2dfd43f2d5d0ac056c1

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