Skip to main content

ai-cost-calculator (Python)

Python SDK for calculating LLM API costs from provider response payloads with automatic usage extraction and live pricing lookups.

Installation

pip install ai-cost-calculator

Requires Python ≥ 3.10.

For development:

uv sync

Usage

Basic — Best-Effort Cost Calculation

The simplest way to get a cost. Tries multiple pricing sources until one succeeds:

from ai_cost_calculator import BestEffortCalculator

response = {
    "model": "gpt-4o-mini",
    "usage": {
        "prompt_tokens": 1000,
        "completion_tokens": 500,
        "total_tokens": 1500,
    }
}

result = BestEffortCalculator.get_cost(response)
print(result)
# {"currency": "USD", "cost": 0.000225}

Using a Specific Pricing Source

Pick a calculator to use a single pricing backend:

from ai_cost_calculator import (
    OpenRouterBasedCalculator,
    BerrilmBasedCalculator,
    PortkeyBasedCalculator,
    HeliconeBasedCalculator,
)

result = BerrilmBasedCalculator.get_cost(response)

With Provider-Prefixed Models

Models prefixed with a provider (e.g. from OpenRouter) are automatically normalized:

result = BestEffortCalculator.get_cost({
    "model": "openai/gpt-4o-mini",
    "usage": {"prompt_tokens": 1000, "completion_tokens": 500, "total_tokens": 1500},
})

Anthropic Response Format

Each provider's response format is handled automatically:

result = BestEffortCalculator.get_cost({
    "model": "claude-sonnet-4-20250514",
    "usage": {"input_tokens": 2000, "output_tokens": 800},
})

Google Response Format

result = BestEffortCalculator.get_cost({
    "model": "gemini-2.0-flash",
    "usageMetadata": {
        "promptTokenCount": 1500,
        "candidatesTokenCount": 600,
        "totalTokenCount": 2100,
    },
})

Error Handling

from ai_cost_calculator import BestEffortCalculator
from ai_cost_calculator.errors import (
    BestEffortCalculationError,
    ModelNotFoundError,
    UsageNotFoundError,
)

try:
    result = BestEffortCalculator.get_cost(response)
except BestEffortCalculationError as e:
    print("All pricing sources failed:")
    for cause in e.causes:
        print(f"  - {cause}")
except UsageNotFoundError:
    print("Could not extract token usage from response")

API Reference

Calculators

All calculators expose a single static method:

@staticmethod
def get_cost(response: Any) -> CostResult
Calculator Pricing Source Fallback Order
BestEffortCalculator All sources OpenRouter → Berri → Portkey → Helicone
OpenRouterBasedCalculator OpenRouter models API —
BerrilmBasedCalculator BerriAI/LiteLLM JSON —
PortkeyBasedCalculator Portkey pricing API —
HeliconeBasedCalculator Helicone pricing API —

Types

class CostResult(TypedDict):
    currency: str   # "USD"
    cost: float

@dataclass(frozen=True)
class TokenUsage:
    input_tokens: float
    output_tokens: float
    total_tokens: float

@dataclass(frozen=True)
class NormalizedPricingModel:
    model_id: str
    input_cost_per_1m: float
    output_cost_per_1m: float
    currency: str  # "USD"

class ResponseMetadata(TypedDict):
    model: str
    provider: str

Errors

All errors extend LlmcostError:

Error Description
UsageNotFoundError Token usage cannot be extracted from the response
ModelNotFoundError Model not found in the pricing source
PricingUnavailableError Pricing values are invalid
ModelInferenceError Model ID cannot be read from the response
ProviderInferenceError Provider cannot be determined from the model
BestEffortCalculationError All sources failed; .causes contains individual errors

Extending Provider Support

Add or update mappings in the root configs/ directory:

  • response-mappings.json — JSONPath expressions for extracting token usage per provider
  • provider-pricing-mappings.json — JSONPath expressions for normalizing pricing payloads

No code changes are required for mapping updates.

Tests

uv run pytest

Live E2E tests run only when LLMCOST_E2E_LIVE=true is set in the root .env.

When live mode is enabled, tests prefer OpenRouter (OPENROUTER_API_KEY) and fall back to native OpenAI (OPENAI_API_KEY). OpenAI endpoint coverage includes:

  • Responses API (/v1/responses)
  • Chat Completions API (/v1/chat/completions)
  • Legacy Completions API (/v1/completions) — runs only when LLMCOST_E2E_OPENAI_COMPLETIONS_MODEL is configured

Metadata

Release files for ai-cost-calculator 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ai-cost-calculator 0.2.1
File Size Uploaded
ai_cost_calculator-0.2.1.tar.gz 20.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ai-cost-calculator 0.2.1
File Interpreter ABI Platform
ai_cost_calculator-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 39.6 kB

Release files / ai_cost_calculator-0.2.1.tar.gz

Download URL ai_cost_calculator-0.2.1.tar.gz
Size 20.8 kB
Tags Source
SHA-256 checksum
How to use checksums
1656e5a09aadc172204bf15c836295c4e4f638d13058f3edc2a6041f33f25b87
BLAKE2b-256 checksum
How to use checksums
50833ba5f9339877f1388607ae02e661f0dee7b45865923f720bdb1fa1034150
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","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}

Release files / ai_cost_calculator-0.2.1-py3-none-any.whl

Download URL ai_cost_calculator-0.2.1-py3-none-any.whl
Size 18.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b2974e47c062995b7bc1398e3e2cb014309f288004f7cab9e04eb0f768b3684d
BLAKE2b-256 checksum
How to use checksums
e91b05adeb4bb33008b2b2f22a0c1351e99c88202d9e469bc157eeb4991fd332
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","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}

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page