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.2.1-py3-none-manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

primeradianthq_obol-0.2.1-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.2.1-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.2.1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f3f6ddaa805c5826605f29406139ed9386aac4cb5331fe7f6b93a0cb7d0af172
MD5 217df9047d011ac76afacca76ba928fd
BLAKE2b-256 a89dad9514bf1344fec8c6c9064d767b53d8c8a2f13dd52f6b647c4d226ab3e6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for primeradianthq_obol-0.2.1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1ddabdbe723e20d262bd7d7be6e44e5811c2f9d3891e786d87541536558d0392
MD5 10d8eb48b44353676b9e8e15728852df
BLAKE2b-256 ef8c806fae47d0cf2449f1cb335e7732218a41103ae06837f853a7dd676c23e1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for primeradianthq_obol-0.2.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1c2c6a7fe60b2ffd4fe4a726ecb77ac2997b13ec3706e2273bf28b64a1c2c9df
MD5 8beb480980e150c1c76a2a5d6464b6c5
BLAKE2b-256 fa9d8e1b7a680fbe4217a40cd3d77631cd97a87d3c5435f7a793f885f0e15a7a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for primeradianthq_obol-0.2.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6cee8048898ff59215e22410bad56b0459cea71b60774ec85a65ea4f01065203
MD5 cd0fde54cd379d984a9897b3f491de48
BLAKE2b-256 a39b335b1139aea38d55e456a429fefa0418151138f1e1be62a54081c7629907

See more details on using hashes here.

Provenance

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