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

$ 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.2.1.tar.gz (24.4 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.2.1-py3-none-win_amd64.whl (5.7 MB view details)

Uploaded Python 3Windows x86-64

airom-0.2.1-py3-none-musllinux_1_2_x86_64.whl (5.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

airom-0.2.1-py3-none-musllinux_1_2_aarch64.whl (5.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

airom-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

airom-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

airom-0.2.1-py3-none-macosx_11_0_arm64.whl (5.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

airom-0.2.1-py3-none-macosx_10_9_x86_64.whl (5.7 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for airom-0.2.1.tar.gz
Algorithm Hash digest
SHA256 19d8b216005f0115888d8c0add930f4110f94c9cc0dd71d049b2d298aa0e3b59
MD5 978afa3639c361f5d2473e98a3150ce9
BLAKE2b-256 71b37e3b117a8154c7fac07c6ed67a797a4e76cff2742b120887509fb548bcf3

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: airom-0.2.1-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.2.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a72b19bfef34e59a42323d2da6872d0666f46f622c0e32ccbcc70ea7afe575be
MD5 0ae09c52234761fc5dd0c4622d75c015
BLAKE2b-256 1527c15b30fdacf464208f30774d1a4e450d48ce296361ef79b5843dec6650dd

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: airom-0.2.1-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 5.6 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.2.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bb78573c8fbc76f84d5a82e199b0ee6130bc3ddc49e6b9e10a3812ccc72bc0f5
MD5 4ff420ee6fdc3d80fbde9a459e91390d
BLAKE2b-256 67bd62db89a3e7c5a4a1c59103cfc11118f71432e06169e31aabcbda25d13ab6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.2.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 39db7054d3adfcbb786c53107ceb3f4d1b166245e2fbb7eef8cc4831ef2a0a67
MD5 79e936d51ad7cba270a59380bad50597
BLAKE2b-256 73e4178e4d1b1430ef7d8c7eedfcbc31bd1a93f3982ad9304f18ad737c3c7dfa

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b6f15e49efaedb4f054d7fce0ba6adad1bc0b3e05ec5216935145d9196d7d354
MD5 407d02c3462e9950f16f6251cc34f338
BLAKE2b-256 2c3a198b8a9f36159b7373c48b2733e7d8653483fc8bf774fe3367943f453a11

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e96caf338feb124499981225e01bc880a755b84bf3b7393141dc4279a9f43159
MD5 ce5753396ced000b158253ef88618f37
BLAKE2b-256 738343906cc32ccccdc291c002360030df493894190aaacb0f903b3ccde4c29f

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: airom-0.2.1-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 5.2 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.2.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5cee0129030d8b0a55bbac37935908ddc08c097d2baa772344bd29866a0bc13b
MD5 a27b8b34adc26873fac3640361d0f626
BLAKE2b-256 cb50e86f78dec666b02f63d128fe6d1002418697797716d6749bef37234152b1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.2.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 72bfeca3d8359a4377efb5de7bc8949bb99744e1564f65ff2da4f6f2f71c96b3
MD5 370a6d8b23f01043dd2e6073f6c057df
BLAKE2b-256 ec6d626c8dd822f3080eba29485bacb96cef5eef8ecd65414c631abd129fb860

See more details on using hashes here.

Provenance

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