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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

primeradianthq_obol-0.6.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.6.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for primeradianthq_obol-0.6.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bd01c7e5de8502c4ee0911943ebcc50d0dd037a386b9978239501b4733ad85e9
MD5 c9b46a306e253d5d492b85ea89070df4
BLAKE2b-256 74997611a872e84acf8c37189f98e7cf8740edfe955703cc2b36d014aaabd33d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for primeradianthq_obol-0.6.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 67311648e3af6ce3a5cca54d9e5513a12814c6dbafa8fc576db305e864628bae
MD5 2d9f451490fceafc54449dd3f976a44c
BLAKE2b-256 4403a72d202c036e5aa865c9f02bd9a1533826ef051db4dc1ab01c1f5a2a101a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for primeradianthq_obol-0.6.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d93bca285f3d83ffff3996abddb8348151e47048219f610acf5ef060cad2cd7
MD5 1d969383f510bfbc3a5f29b4c7d8dd02
BLAKE2b-256 9dac2f0152470b3027cf1d89f0c51d4f2f82f61e69265c4d94e7c7b7dee9e4a8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for primeradianthq_obol-0.6.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0edbe4e07bce9b1c3151897d4e162017826cded9f7d83d86e4326d7b72401b77
MD5 50e3d8956f0845a354cf3f4b5045b48d
BLAKE2b-256 17e8ea42f34b76de5eeb45672dfbced1b3fe203dad21ac80af69ea252f68f114

See more details on using hashes here.

Provenance

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