Skip to main content

Estimate the USD cost of an AI-agent transcript (Claude Code, Codex, Pi).

Project description

obol — Python binding (ctypes)

Installing from PyPI: pip install primeradianthq-obol, then import obol. The native library is bundled in the wheel — no Rust toolchain, no cargo build, no OBOL_LIB. The sections below are for in-repo development.

A thin, pure-Python binding over obol's C ABI (obol-ffi). No build step: it loads the prebuilt shared library with ctypes and re-types the JSON the Rust core returns. The Rust core stays the single source of truth for all accounting; this package only marshals C strings and parses JSON into dataclasses.

Install / point at the library

The binding needs the obol-ffi shared library (libobol_ffi.dylib on macOS, libobol_ffi.so on Linux). It is located, in order:

  1. $OBOL_LIB — an explicit absolute path to the shared library.
  2. Beside the installed obol package (for packaged installs).
  3. target/release/ then target/debug/ relative to the repo root (for in-tree dev).

For in-tree development, just build the dylib and the target/debug fallback finds it with no env:

mise exec rust@1.96.0 -- cargo build -p obol-ffi

If the library lives somewhere else, set OBOL_LIB=/abs/path/to/libobol_ffi.dylib.

Usage

import obol

print(obol.version())  # "0.1.1"

est = obol.estimate_path("transcript.jsonl", dialect="claude")
print(est.total_usd, est.pricing_as_of)
for m in est.per_model:
    print(m.model, m.provider, m.subtotal_usd)

# Refresh the on-disk pricing snapshot (network; caller supplies the date):
report = obol.refresh("2026-06-05")

On a nonzero status, the call raises obol.ObolError carrying .code, .kind, and .message from the FFI error envelope.

Pricing tables must exist

estimate_path reads a pricing snapshot from disk. Either run obol refresh (the CLI), or point OBOL_PRICING_DIR at a directory containing current.json. With no snapshot the call raises ObolError with kind == "PricingTablesMissing" (code 1).

Ownership & safety contract

obol owns every string it returns through an out-parameter. This binding honors the contract automatically in _lib._decode_and_free: it copies the obol-owned C string into Python bytes, then calls obol_string_free, then the caller parses the copy. The Rust-owned pointer never outlives the copy and is never freed twice. obol_version() returns a static string and is never freed. You do not manage any of this yourself — the public API returns plain dataclasses.

Tests

mise exec rust@1.96.0 -- cargo build -p obol-ffi   # build the dylib first
cd bindings/python && PYTHONPATH=. python -m pytest tests -q

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

primeradianthq_obol-0.7.0-py3-none-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

primeradianthq_obol-0.7.0-py3-none-macosx_10_12_x86_64.whl (1.3 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 80a52807ced06707cb829f479752c2a794b384b2943a1c5536e47362556e50ef
MD5 46fe1aabacfeeba0c03826c25ab34430
BLAKE2b-256 f11b4db64607cb2703ed6246d26ee057ac1459c454de8cb7ca163113c2598be7

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_x86_64.whl:

Publisher: pypi-release.yml on prime-radiant-inc/obol

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

File details

Details for the file primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 48bf9ef14db601c92d9d81b9d14ab01716a61ef7546c08d591b23fc0ba2ae8f9
MD5 c29b77b950578c6db48b8784641cec58
BLAKE2b-256 6e7ed73358e296ba88730ceadb7752d5671657680fccefc0678648baed282643

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.7.0-py3-none-manylinux_2_28_aarch64.whl:

Publisher: pypi-release.yml on prime-radiant-inc/obol

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

File details

Details for the file primeradianthq_obol-0.7.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.7.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 78154cc8305854bdcc194d5e040db8ea7aa325f21d7bc3547f7e3813db9645c3
MD5 aa3a0a0ac6c0bcce4efc271e1ac76c50
BLAKE2b-256 45a1c7047a274bd79e27519994ee3b3c9a6d546f1ffca5e309cff47c791a5fac

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.7.0-py3-none-macosx_11_0_arm64.whl:

Publisher: pypi-release.yml on prime-radiant-inc/obol

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

File details

Details for the file primeradianthq_obol-0.7.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.7.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e77c552260f4125ec4a4318e0f182f6383e9be24fc12c2e3bcdb1036c5a579e4
MD5 d5936bbf1cad1f23599589badaee5349
BLAKE2b-256 3c9abe69357c43f99ccd301a0fad7e15719e48491e90b281cc03aceec6dd25cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.7.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: pypi-release.yml on prime-radiant-inc/obol

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