Skip to main content

Python SDK for AIROM — the open-source AI Bill of Materials (AIBOM) scanner

Project description

airom — Python SDK

Python SDK for AIROM, the open-source AI Bill of Materials (AIBOM) scanner. Discover AI assets — models, prompts, datasets, embeddings, vector databases, frameworks, serving infrastructure — across code, containers, and Kubernetes, and get them back as typed Python objects.

pip install airom

This installs both the airom command and the Python library — the wheel ships the scanner binary itself into your environment's bin/, so there is nothing else to install:

$ airom --version
airom 0.1.7

$ airom fs ./my-app -o table          # the CLI, globally

Quick start

import airom

inv = airom.fs("./my-app", min_confidence=0.8)

for c in inv.by_kind(airom.ComponentKind.HOSTED_LLM):
    print(c.name, c.provider.or_default("-"), c.confidence)
    for occ in c.evidence.occurrences:
        print(f"   {occ.location.path}:{occ.location.line}  [{occ.detector_id}]")
gpt-4.1 openai 0.87
   src/rag.py:88  [rules/openai/model-literal]
   src/agent.py:12  [rules/openai/sdk-import]

Every component carries the evidence that justifies it — that is the point of AIROM, and the SDK hands you all of it.

Scanning

airom.scan("./app")                       # auto-detect: path, git URL, or image ref
airom.fs("./app")                         # a directory tree
airom.repo("https://github.com/o/r")      # remote (shallow clone) or a local worktree
airom.image(input="img.tar")              # docker save -o img.tar <ref>
airom.k8s(manifests="./deploy")           # offline: enumerate workload images
airom.version()                           # the underlying binary's ToolInfo

Common keyword args mirror the CLI flags: select, rules, ignore, min_confidence, max_file_size, io_budget, parallel, no_cache, cache_dir, offline, stats, plus binary, timeout, and cwd. None leaves the tool's own default in place — the SDK never invents defaults.

min_confidence=0.8 is the practical high-signal filter: on general-purpose directories, extension-only dataset detection and keyword-only generation-param detection emit low-confidence (0.5–0.6) noise. Note the application root always survives the filter — it is the scan target, not a finding.

select tokens are detector IDs or tags, not languages — "-dataset/file", not "python". Run airom detectors list (or airom.raw(["detectors", "list"])) to see them.

Not wired yet: pulling an image from a live registry/daemon, and live-cluster Kubernetes scanning. Both fail with a clear error. Use image(input=...) / an OCI layout and k8s(manifests=...) today.

Tri-state fields

version, provider, download_location and release_time are tri-state, and the SDK preserves the distinction rather than collapsing it into None:

JSON Meaning Opt
key omitted does not apply Presence.ABSENT
null applies, but undetermined (SPDX NOASSERTION) Presence.UNKNOWN
a value known Presence.KNOWN
c.version.known           # bool — only True when a real value is present
c.version.or_none()       # value, or None (collapses absent and unknown)
c.version.or_default("-") # value, or your fallback
c.version.presence        # the full distinction, when you need it

Navigating the graph

inv.components                  # sorted, deterministic
inv.by_kind("vector-db", "framework")
inv.get("airom:1f3a9b2c4d5e6f70")
inv.application                 # the scan-root component
inv.edges_from(c.id)            # typed, evidenced relationships
inv.unknowns                    # "looked relevant, could not process" — honesty channel
inv.stats.files_walked          # requires stats=True
len(inv); [c for c in inv]      # Inventory is sized and iterable

CI gating

A fail_on match is a verdict, not an error — the scan succeeded and the AIBOM is complete, so it is reported rather than raised:

res = airom.execute(
    ["fs", "./app"],
    options=airom.ScanOptions(fail_on="hosted-llm&confidence>=0.9", exit_code=7),
)
if res.policy_matched:
    raise SystemExit(res.exit_code)

Often you don't need fail_on at all — you have the whole graph, so gate in Python:

risky = [c for c in inv if c.model and c.model.pickle_risk]
if risky:
    raise SystemExit(f"unsafe pickle globals in: {[c.name for c in risky]}")

Errors

Exception Raised when
BinaryNotFoundError the airom executable could not be located
ScanError a fatal scan failure (exit 2): unreadable target, clone failure, bad flags
OutputError no parseable AIBOM, or an unsupported schemaVersion

Detector errors are not exceptions: they degrade to inv.unknowns records and the scan still succeeds. That is AIROM's degrade-by-default contract, and the SDK preserves it.

The binary

The SDK shells out to the airom binary and decodes its native JSON — the lossless superset every other format (CycloneDX, SARIF, YAML, table) projects from. Resolution order:

  1. the binary= argument
  2. a copy bundled in the wheel (airom/_bin/airom)
  3. $AIROM_BINARY
  4. airom on PATH

Platform wheels bundle the binary as a script, so pip installs it into the environment's bin/ (Scripts\ on Windows): pip install airom gives you a working airom command on PATH and the importable library, with no Python shim in between. In a virtualenv it is on PATH as soon as the venv is active; pipx install airom or pip install --user airom puts it on PATH globally.

The library resolves the binary without relying on PATH at all (it consults the environment's scripts dir directly), so import airom works even from an unactivated venv's interpreter.

Installing from an sdist ships no binary — put airom on your PATH (go install github.com/airomhq/airom/cmd/airom@latest, then ensure $(go env GOPATH)/bin is on PATH) or set $AIROM_BINARY.

Development

cd sdk/python
pip install -e ".[dev]"
pytest            # builds the binary from the checkout and tests against it
mypy && ruff check .

The suite runs against the real binary, not mocks: a wrapper tested only against mocks proves nothing about the contract it wraps.

Building a wheel needs the Go toolchain (the build hook compiles the binary with CGO_ENABLED=0). Set AIROM_SKIP_BUNDLE=1 for a pure-Python wheel.

Publishing

Releases are published by .github/workflows/release-pypi.yml using PyPI Trusted Publishing (OIDC): GitHub Actions authenticates to PyPI directly, so there is no API token stored as a secret, and none to leak or rotate.

One-time setup

On pypi.org/manage/account/publishing, add a pending publisher:

Field Value
PyPI project name airom
Owner airomhq
Repository name airom
Workflow name release-pypi.yml
Environment (leave blank)

That is all — no secret is added to GitHub.

Cutting a release

The workflow runs on every push to main that touches the SDK or the scanner, but publishes only when the version is new: PyPI permanently refuses to re-upload a version (even a deleted one), so the workflow compares __version__ against the index and skips cleanly if it is already there.

So a release is exactly one deliberate act:

# sdk/python/src/airom/__init__.py
__version__ = "0.1.0"     # bump, commit, merge to main -> published

Publishing is irreversible: a version number is burned forever once used, and yanking does not free it. Test the whole path first with the manual workflow_dispatch run against TestPyPI (which needs its own pending publisher at test.pypi.org).

License

Apache-2.0, same as AIROM.

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

airom-0.1.7.tar.gz (24.3 kB view details)

Uploaded Source

Built Distributions

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

airom-0.1.7-py3-none-win_amd64.whl (5.7 MB view details)

Uploaded Python 3Windows x86-64

airom-0.1.7-py3-none-musllinux_1_2_x86_64.whl (5.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

airom-0.1.7-py3-none-musllinux_1_2_aarch64.whl (4.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

airom-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

airom-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

airom-0.1.7-py3-none-macosx_11_0_arm64.whl (5.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

airom-0.1.7-py3-none-macosx_10_9_x86_64.whl (5.6 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file airom-0.1.7.tar.gz.

File metadata

  • Download URL: airom-0.1.7.tar.gz
  • Upload date:
  • Size: 24.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for airom-0.1.7.tar.gz
Algorithm Hash digest
SHA256 3c5c990b0b9e8263e5bf1ee148d64daae8ecfabbc2e2b1662d359872ebe173d5
MD5 b481562ccabc467b9e739da3d8ca9986
BLAKE2b-256 1590b65c8b99f8e145163fcd0a305bc5c5763e34f1277ff6c0d32176206f53cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7.tar.gz:

Publisher: release-pypi.yml on airomhq/airom

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

File details

Details for the file airom-0.1.7-py3-none-win_amd64.whl.

File metadata

  • Download URL: airom-0.1.7-py3-none-win_amd64.whl
  • Upload date:
  • Size: 5.7 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for airom-0.1.7-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 5036a1ae4b30de1f1512c78d132b68b19acc3beb124ffb3d1aa8e2c871f09e82
MD5 1e1ea59ee48f400d0da7e87211bb277e
BLAKE2b-256 7332d10e5a8d82c5dc7ec052c11ac1c153ec28d342101ecc86006ac3d97ab462

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7-py3-none-win_amd64.whl:

Publisher: release-pypi.yml on airomhq/airom

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

File details

Details for the file airom-0.1.7-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: airom-0.1.7-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 5.5 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for airom-0.1.7-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 73b28cab24a15b78751c92e078709e4a70a6589642b8f1ef756ee016256f37b3
MD5 8fddbcda9c258c3fe6836b71bf2aa143
BLAKE2b-256 9a5c3d0e6ba46a5a53944c14b6689b28a0d21623a8be8c6aeb9616e589774ef3

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release-pypi.yml on airomhq/airom

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

File details

Details for the file airom-0.1.7-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for airom-0.1.7-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d83b142d50a22cd7554a95ecec826b79f27d8b0b56f5005802cac9c00943074e
MD5 b2f1ebd3a90dc9c5c9d409faeec173b3
BLAKE2b-256 030137c2ca57bfd6254f51ad9348afca247f863ea11ff5d5d21188c644b67d80

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release-pypi.yml on airomhq/airom

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

File details

Details for the file airom-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for airom-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5eb83cd45732be95b6bd0cbd057b00738c1c1e7a44c00c6d60a211dc976dd34c
MD5 5ad2b87961342f28150b2d894ed1849b
BLAKE2b-256 0bd1d054f435f74a4335d2ed88ba248a4cf9aeeee5451aaad85bb7fe5e4db72b

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-pypi.yml on airomhq/airom

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

File details

Details for the file airom-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for airom-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2fc2168a29fefe09c99241cbdb20e4c89e3e913f8844f9ebf9c8456a6589b398
MD5 582e2a34945cc6b0f0bae155dd08a630
BLAKE2b-256 fa000c65e3d7228f4b4c69e29c28d1270cdcfc3a8d84c0c87759dfb888518f70

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-pypi.yml on airomhq/airom

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

File details

Details for the file airom-0.1.7-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: airom-0.1.7-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 5.1 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for airom-0.1.7-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e307341de1f44a01b5f1090aee8abb202920dab08fec730ade1aaa4e053aa1e8
MD5 32594233530ce652771f3df08d481305
BLAKE2b-256 55d0373f0b127748367f87c7af997811a4d2967772c0f5352ddc31e83f31defd

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7-py3-none-macosx_11_0_arm64.whl:

Publisher: release-pypi.yml on airomhq/airom

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

File details

Details for the file airom-0.1.7-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for airom-0.1.7-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 33c27b388e1ca8187c7499ab96e34b781ff2506d74ad36f8e8f329b7e35245c4
MD5 ca2150ed87c5f806aba3408e5141b591
BLAKE2b-256 5ec1996a66d0b8fb595bcd690e4570e3ca86f2043d73d1c72522315c0e249515

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.7-py3-none-macosx_10_9_x86_64.whl:

Publisher: release-pypi.yml on airomhq/airom

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