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.8.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.8.0-py3-none-manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

primeradianthq_obol-0.8.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.8.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.8.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 eb1079b99fc675658c2c806692c1e21cf16eea08337b72fc1c89e019a106bf06
MD5 f3053faec175e55bff163e49cf4e1bd3
BLAKE2b-256 25923bdf04dd6847a5a0febd787bc20dfaffd6900ab87717a068182988ebc540

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.8.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.8.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.8.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8ebfb9770dd2f8b8a9c5cef67db8771279226ea8c825dcd3651797e77b77b10a
MD5 aa153da15f54d6f375e4ff973e4d94e1
BLAKE2b-256 20ab86b6b187ac2e77c2a37c724718960ebb0d6b1b2d5ea9f65ccfd2f6b37417

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.8.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.8.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.8.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f51b3ff84835935cd5fe2c5e6ab366a12c1932d258befa1825dbc01c52c2d3cf
MD5 09c98210603a150d0935478aaad932cd
BLAKE2b-256 b159299229ca7b7849822994edb99ed2d1c34bd88440f8851f5ed7a45cb90819

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.8.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.8.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.8.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 930cb6054af6f6b1e44fd2b445816c536b36aa2015e745a882f80d136df120f1
MD5 0e6bea188e9052f7cd4c8b1ef61573a3
BLAKE2b-256 44ed6c4b54090efab6ce21ac4cfe655f3cb5507eee7a4f7ad504db4bb100a2a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for primeradianthq_obol-0.8.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