Skip to main content

Python client for ModelPricing.ai cost estimates and tracking

Project description

modelpricing-ai

licensie

Python client for the ModelPricing.ai API — estimate LLM usage costs and track spending with a single call.

Installation

pip install modelpricing-ai

For async support (requires aiohttp):

pip install modelpricing-ai[async]

Quick Start

from modelpricing_ai import ModelPricingClient

with ModelPricingClient(api_key="YOUR_API_KEY") as client:
    estimate = client.estimate(
        model="claude-haiku-4-5-20251001",
        tokens_in=1000,
        tokens_out=500,
        trace_id={"requestId": "abc-123"},
    )
    print(f"Cost: ${estimate.total:.6f}")

From a provider SDK response

If you already have a response object from the Anthropic or OpenAI SDK, pass it directly — the client pulls the model name and token counts for you. Works with Anthropic Messages, OpenAI Chat Completions, and OpenAI Responses API (Pydantic objects or plain dicts).

from anthropic import Anthropic
from modelpricing_ai import ModelPricingClient

anthropic = Anthropic()
response = anthropic.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=1024,
    messages=[{"role": "user", "content": "hello"}],
)

with ModelPricingClient(api_key="YOUR_API_KEY") as client:
    estimate = client.estimate_from_response(response)
    print(f"Cost: ${estimate.total:.6f}")
from openai import OpenAI
from modelpricing_ai import ModelPricingClient

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

with ModelPricingClient(api_key="YOUR_API_KEY") as client:
    estimate = client.estimate_from_response(response)

The async client exposes the same method: await client.estimate_from_response(response).

Cache tokens

Cache metrics are additive: tokens_in contains only fresh, non-cached input. Pass generic OpenAI writes separately from Anthropic's TTL-specific writes:

estimate = client.estimate(
    model="gpt-5.6-terra",
    tokens_in=10_000,
    tokens_out=1_000,
    cache_read_tokens=2_000,
    cache_write_tokens=5_000,
)

estimate_from_response() extracts OpenAI cached_tokens and cache_write_tokens automatically. For Anthropic, it extracts cache reads and the 5-minute/1-hour write buckets into cache_write_5m_tokens and cache_write_1h_tokens.

Async Usage

Install the async extra, then use AsyncModelPricingClient as an async context manager:

import asyncio
from modelpricing_ai import AsyncModelPricingClient

async def main():
    async with AsyncModelPricingClient(api_key="YOUR_API_KEY") as client:
        estimate = await client.estimate(
            model="claude-haiku-4-5-20251001",
            tokens_in=1000,
            tokens_out=500,
            trace_id={"requestId": "abc-123"},
        )
        print(f"Cost: ${estimate.total:.6f}")

asyncio.run(main())

Response Structure

All estimate methods (estimate, estimate_from_response, and their async counterparts) return an EstimateResponse object:

estimate.total        # float — total USD cost
estimate.model        # str   — canonical model name
estimate.traceId      # dict | None — your pass-through trace ID
estimate.breakdown    # EstimateBreakdownGroup
  .input              # EstimateBreakdown
    .unit             #   str   — e.g. "token"
    .branch           #   str   — pricing tier that matched
    .qty              #   int   — number of input tokens
    .rate             #   float — per-unit rate
    .subtotal         #   float — input cost
  .output             # EstimateBreakdown (same fields for output tokens)

Configuration

Parameter Default Description
api_key required Your ModelPricing.ai API key (also reads MODELPRICING_API_KEY env var)
base_url "https://api.modelpricing.ai" API base URL (also reads MODELPRICING_BASE_URL env var)
timeout 30.0 Request timeout in seconds
max_retries 3 Maximum retry attempts for transient errors
session None Optional requests.Session (sync) or aiohttp.ClientSession (async)

Parameters are resolved in order: constructor argument > environment variable > default.

client = ModelPricingClient(
    api_key="YOUR_API_KEY",
    base_url="https://api.modelpricing.ai",
    timeout=30.0,
    max_retries=3,
)

Error Handling

The client raises typed exceptions for different failure modes. All of them inherit from ModelPricingError and carry a status_code attribute:

Exception HTTP Status When
Unauthorized 401 Invalid or missing API key
NotFound 404 Unknown endpoint
ValidationError 422 Invalid model name or metrics
ServerError 5xx Server-side failures (retried automatically)
ModelPricingError other Base class — raised on unexpected status codes or malformed 200s
from modelpricing_ai.errors import Unauthorized, ValidationError, ServerError

try:
    estimate = client.estimate(model="claude-haiku-4-5-20251001", tokens_in=1000, tokens_out=500)
except Unauthorized:
    print("Check your API key")
except ValidationError as e:
    print(f"Bad request: {e}")
except ServerError:
    print("Server error — will be retried automatically")

Retry Behavior

The client automatically retries on transient errors with exponential backoff:

  • Retries: 5xx server errors and network/connection errors
  • No retry: 4xx client errors (401, 404, 422)
  • Default: 3 retries with exponential backoff (0.1 s initial, 2 s max)
# Increase retries for unreliable networks
client = ModelPricingClient(api_key="YOUR_API_KEY", max_retries=5)

# Disable retries (no retry attempts)
client = ModelPricingClient(api_key="YOUR_API_KEY", max_retries=0)

License

MIT

Credits

Made with ❤️ by Humanspeak

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

modelpricing_ai-2026.7.0.tar.gz (10.5 kB view details)

Uploaded Source

Built Distribution

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

modelpricing_ai-2026.7.0-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

File details

Details for the file modelpricing_ai-2026.7.0.tar.gz.

File metadata

  • Download URL: modelpricing_ai-2026.7.0.tar.gz
  • Upload date:
  • Size: 10.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for modelpricing_ai-2026.7.0.tar.gz
Algorithm Hash digest
SHA256 10bea56c147cd8456a587844b5c5b0332fb00fcd3b7c952b6c1a783fa9eb0b90
MD5 d3cc5669aabd4848d5b332203e0751d0
BLAKE2b-256 a404f59ba89c985490e3cbcd5b2fce2c89e511ceb084763bd34a577b987aba1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for modelpricing_ai-2026.7.0.tar.gz:

Publisher: publish-python.yml on humanspeak/modelpricing-ai

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file modelpricing_ai-2026.7.0-py3-none-any.whl.

File metadata

File hashes

Hashes for modelpricing_ai-2026.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c2421c72c90e81a3b8ec6ca6cdcb74938d60c38cc01858d4c6c2c4190c890e57
MD5 2b57c8e859b48937908cbe35133a9795
BLAKE2b-256 5524cf5558fb94e2314bab9ae1d8cb60ce5c48b1d4c9a2bfa93510dcf33b5ce5

See more details on using hashes here.

Provenance

The following attestation bundles were made for modelpricing_ai-2026.7.0-py3-none-any.whl:

Publisher: publish-python.yml on humanspeak/modelpricing-ai

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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