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.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.1.3.tar.gz (23.9 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.3-py3-none-win_amd64.whl (5.5 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

airom-0.1.3-py3-none-musllinux_1_2_aarch64.whl (4.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

airom-0.1.3-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.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

airom-0.1.3-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.3.tar.gz.

File metadata

  • Download URL: airom-0.1.3.tar.gz
  • Upload date:
  • Size: 23.9 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.3.tar.gz
Algorithm Hash digest
SHA256 a21631a7bbd4e94f1c86c866b3763276c3bb045299e7df77794d9f7f23fc588b
MD5 281af7d10f98e7a7850ad6ae91888018
BLAKE2b-256 7b4193a32ce9bfe0762e1226cf58c1a030319436decef46f1eca7a68258aa40b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: airom-0.1.3-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.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 4aaf63e530a42a708d4ab393f3cbe28db268b3d62b7704dadee2be21720be8a4
MD5 d872398ffd4de28eeab9e90bc9e2450c
BLAKE2b-256 3e3da0ff99f40d09a8c5f8bfc319995e1835dab660eab347efeea7808d4f1b4b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: airom-0.1.3-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.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5dd4466313b382eb92c232d9f5af16342750de2c94504e238e745e702314bbf4
MD5 f9ec6eb3abf83a2dba1c9c53db51696b
BLAKE2b-256 4bc894dd968f67aaba7c3ecbca609302c868e978ed473008598f956889e3caa4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.1.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5b38479f4571e89266a4046628afa25aa789e3ae7ffa6ca2a4a24926b2b35a4c
MD5 8f1086e359ae3344947e9e300ceb6bb0
BLAKE2b-256 504545dd07ffda22a21aed3ebb5a27e10336f98a97d9826d934730e18f827009

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 14c5e9ccba3cf8e57b789be9390fa7d29d9e17cfc8396bbc026a08b0a4ce22dd
MD5 14e90bff9a7c04aefa85356a02b62304
BLAKE2b-256 dc10c88598ca358686700a891ba28ad866831d3b6a34178ea2d379af32d98b6b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8cf1cedd02519c2182ed999abe6e3abea588c6422cf30fc5b01cd30290ef4892
MD5 8d7f590c255d6ba6cb21908726b9fa6c
BLAKE2b-256 790eb71cdc4591bf6dbecb87edc9c3f49974dbabf9d9699ad3274bb6c5c58da1

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: airom-0.1.3-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.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3040af318a9d116e2fb53def835f63ef6e2585e0455365655b83c40909fd220e
MD5 798e7ec4d5a774b711b401763490d44c
BLAKE2b-256 bf03d75ab8624debc7f7bf9d889ee52d465e106c3e96e78e1ec26ca5030e3c96

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for airom-0.1.3-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d00558a271904ec3673e4bc921da7f39d7afa9a9aab7b1fb22d25ec4d0872ed7
MD5 4ebc441b58def163316d1bc68986798b
BLAKE2b-256 b3e15d39f5b5c0afe0aacc08ab5505e8b4047b8e79018f3e6f507fc4824f6cd1

See more details on using hashes here.

Provenance

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