# AI System SBOM Example (CycloneDX)
A worked example of a software bill of materials for an AI system.

_An annotated CycloneDX-flavored SBOM showing how to record model weights, training data, dependencies, and runtime images for an AI system._

Used in: Lesson expert/06 — https://vetslearn.com/lessons/expert/06
Source: https://vetslearn.com/resources/templates/engineering#t-sbom-example

---

# Example SBOM for an AI System

This is a worked example, not a generator. Use it to see what a real AI SBOM contains, then produce yours with a tool like Syft, Trivy, or your build pipeline. Annotations are inline with `// ←` markers.

```json
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "version": 1,
  "metadata": {
    "timestamp": "2026-06-09T12:00:00Z",
    "component": {
      "type": "application",
      "name": "claims-summarizer",
      "version": "2.4.1"
    }
  },
  "components": [

    // ← Model weights. One entry per model in the deployment.
    {
      "type": "machine-learning-model",
      "name": "claims-summarizer-ft-v3",
      "version": "3.0.0",
      "description": "Fine-tune of base model on claims dataset",
      "hashes": [
        { "alg": "SHA-256", "content": "a3f5...e2c1" }
      ],
      "licenses": [{ "license": { "id": "Apache-2.0" } }],
      "externalReferences": [
        { "type": "distribution", "url": "s3://internal-models/claims-summarizer-ft-v3.safetensors" }
      ],
      "properties": [
        { "name": "base_model", "value": "meta-llama/Llama-3.1-8B-Instruct" },
        { "name": "base_model_hash", "value": "SHA-256:b8d2...44ac" },
        { "name": "training_method", "value": "LoRA, r=16, alpha=32" }
      ]
    },

    // ← Training data summary. Not the data itself — the manifest.
    {
      "type": "data",
      "name": "claims-fine-tune-set-2026Q1",
      "version": "1.0",
      "description": "Curated claims documents, deidentified",
      "hashes": [
        { "alg": "SHA-256", "content": "7c1a...9b88" }
      ],
      "properties": [
        { "name": "row_count", "value": "42000" },
        { "name": "source", "value": "Internal CRM 2024-2025, deidentified per policy SEC-12" },
        { "name": "pii_scan", "value": "passed 2026-02-15" },
        { "name": "license", "value": "Internal use only" }
      ]
    },

    // ← Framework and library dependencies. Pin every version.
    {
      "type": "library",
      "name": "transformers",
      "version": "4.46.2",
      "purl": "pkg:pypi/transformers@4.46.2",
      "licenses": [{ "license": { "id": "Apache-2.0" } }]
    },
    {
      "type": "library",
      "name": "vllm",
      "version": "0.6.3",
      "purl": "pkg:pypi/vllm@0.6.3",
      "licenses": [{ "license": { "id": "Apache-2.0" } }]
    },
    {
      "type": "library",
      "name": "langchain",
      "version": "0.3.7",
      "purl": "pkg:pypi/langchain@0.3.7",
      "licenses": [{ "license": { "id": "MIT" } }]
    },

    // ← Runtime container image. Record the digest, not just the tag.
    {
      "type": "container",
      "name": "claims-summarizer-runtime",
      "version": "2.4.1",
      "purl": "pkg:oci/claims-summarizer-runtime@sha256:c4f1...d9b2",
      "properties": [
        { "name": "base_image", "value": "nvidia/cuda:12.4.1-runtime-ubuntu22.04" },
        { "name": "hardened", "value": "true" }
      ]
    },

    // ← Vector database used at runtime.
    {
      "type": "application",
      "name": "qdrant",
      "version": "1.11.0",
      "purl": "pkg:docker/qdrant/qdrant@1.11.0",
      "licenses": [{ "license": { "id": "Apache-2.0" } }]
    }
  ],

  "dependencies": [
    {
      "ref": "claims-summarizer",
      "dependsOn": [
        "claims-summarizer-ft-v3",
        "transformers",
        "vllm",
        "langchain",
        "claims-summarizer-runtime",
        "qdrant"
      ]
    }
  ]
}
```

## What to record at minimum

- Every model: name, version, hash, base model, license, source
- Every training dataset: name, hash, row count, source, license, PII scan date
- Every library: name, version, purl, license
- Every runtime image: digest, base image
- Every external service: vendor, version, SOC2 status

---

## How to use

Generate this from the build pipeline, not by hand. Store one per release. Diff it against the previous release before deploy — an unexpected new dependency is a finding. Federal procurement is moving toward requiring an SBOM at delivery. Get ahead of it. The piece most teams skip is the model and training-data section — that is the part regulators care most about.

## Check before you use it

- Generate yours from the build pipeline. A hand-edited SBOM is wrong by the second release.
- The model and training-data components carry real hashes, not the example values from this page.
- Diff against the previous release before deploy. An unexpected dependency is a finding.
