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.5

$ 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.5.tar.gz (24.0 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.5-py3-none-win_amd64.whl (5.5 MB view details)

Uploaded Python 3Windows x86-64

airom-0.1.5-py3-none-musllinux_1_2_x86_64.whl (5.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

airom-0.1.5-py3-none-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

airom-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

airom-0.1.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

airom-0.1.5-py3-none-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

airom-0.1.5-py3-none-macosx_10_9_x86_64.whl (5.4 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: airom-0.1.5.tar.gz
  • Upload date:
  • Size: 24.0 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.5.tar.gz
Algorithm Hash digest
SHA256 9f45d5940c351d26e8d18d96017603cccb342a41286cbebdb5cab97ff578bbb2
MD5 38da36a3decfa3cf767b591d14c43e89
BLAKE2b-256 f97aed801f97b33301a1eafb425714fb9b3430690e01062a3fa6aa280e50788d

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5.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.5-py3-none-win_amd64.whl.

File metadata

  • Download URL: airom-0.1.5-py3-none-win_amd64.whl
  • Upload date:
  • Size: 5.5 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.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 fb109b6877d5e9f278673b3af2ed01dd8991ad2536e5c5b17dda4007022f267b
MD5 83b476cfbe8dbbe7364a63ea472dec70
BLAKE2b-256 6e9f23b7e72ea4ea77eebb52704665f6a8a52476843594f4468eaf2188542ed7

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5-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.5-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: airom-0.1.5-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 5.3 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.5-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3b0024027ea36f2084ccc66d68f2eb9c36bb942567ce1c336b23dcac9bd28046
MD5 d1dd678a23958a1f258ca27a7edea71e
BLAKE2b-256 c70a007d839175aac0aa4e96102c46a3b14a638a14cf77fca651cc0ffad98a39

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5-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.5-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for airom-0.1.5-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b8c2e9db57de7536b61bd76bacfc6abd341844ecfab5c7cd7814b428494cfd2d
MD5 7c0bd475e168c1d72ff61bb4bdf0a4fb
BLAKE2b-256 5520fffb29946bbe3f494829da4ccba1788a111af9f92bbaae0b45b84e872bf3

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5-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.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for airom-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8652890e5a3457b5a88e4ccdbb8b5c532ff00052e215a1fefa6d3e42437b6c6d
MD5 5ec2ce30cdaa5feeceaef335f4ade35c
BLAKE2b-256 eb2874f4d1437b2753a935f332e62d879fb23b220a98b2ae0b7566daf48e8176

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5-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.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for airom-0.1.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8d23606fb4e74ad6e80ff049e5ef9b10c1fee5ccab7c7f88ce85fafa7fc8fe44
MD5 8a89abf53ad92d016666619dce162d83
BLAKE2b-256 47b3b906b8f9c2584cabd8d71c6f1db47c15e23dbc0c37f5e806a72205f918a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5-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.5-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: airom-0.1.5-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 4.9 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.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a7375993befcfc965e3fc899ce0b4e0b4bc4a98b0380408b4f204241bc5239f
MD5 a3dd60d5e916078045679ad16707d004
BLAKE2b-256 29b3be77f80a1a8906a41a84d3810a60e60af3a6f87c564f5070667036cfac08

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5-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.5-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for airom-0.1.5-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 854d7a1feaa5a43d0ec9c86c27f1ef860b404a5ef1ee106bd006bf3f8f0c66fd
MD5 383e11ce9db296f0ce13505618dbe9ef
BLAKE2b-256 a4307d452015f29c8d940c203106b49500bb169873cf66ebd0a0b8ac44042e5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for airom-0.1.5-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