Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

Xelo

Xelo is an open-source AI SBOM (Software Bill of Materials) generator for agentic and LLM-powered applications. It scans source code and configuration, produces an extensive, structured AI-BOM document and exports into various formats - markdown, CycloneDX, etc. It has plug-ins for security analysis. Most of these features work without using any LLM calls or requiring external network access. Truly deterministic and safe to run in any environment.

Inspiration

There is a genuine need for better visibility into the rapidly growing ecosystem of AI components in modern applications. Xelo is inspired by the success of software bills of materials (SBOMs) in improving supply chain security and transparency, and aims to bring similar benefits to the world of AI applications.

For official documentation, visit https://nuguardai.github.io/xelo.

What Xelo Does

Xelo analyses a repository and produces an AI SBOM — a machine-readable inventory of every AI component it can find:

  • Agents — agentic orchestrators (LangGraph graphs, CrewAI crews, AutoGen agents, OpenAI Agents, …)
  • Models — LLM and embedding model references, including provider and version
  • Tools — function tools and MCP tools wired to agents
  • Prompts — system instructions and prompt templates (full content preserved)
  • Datastores — vector stores, databases, caches; with PII/PHI data-classification from SQL and Python models
  • Guardrails — content filters and safety validators
  • Auth — authentication nodes (OAuth2, API key, Bearer, JWT, MCP auth providers)
  • Privileges — capability grants (db_write, filesystem_write, code_execution, …)
  • Deployment — Docker image references, cloud targets, IaC context

Xelo runs a 3-phase pipeline: AST-aware adapters → regex fallbacks → optional LLM enrichment. The first two phases are fully deterministic and require no API key.

Supported Frameworks

Python: LangChain, LangGraph, OpenAI Agents SDK, CrewAI (code + YAML), AutoGen (code + YAML), Google ADK, LlamaIndex, Agno, AWS BedrockAgentCore, Azure AI Agent Service, Guardrails AI, MCP Server (FastMCP / low-level), Semantic Kernel

TypeScript / JavaScript: LangChain.js, LangGraph.js, OpenAI Agents (TS), Azure AI Agents (TS), Agno (TS), MCP Server (TS)

Installation

pip install xelo

Install for development (all extras):

pip install -e ".[dev]"

Quickstart

Scan a local repository:

xelo scan ./my-repo --output sbom.json

Scan a remote repository:

xelo scan https://github.com/org/repo --ref main --output sbom.json

Add LLM enrichment for richer output (recommended for production use):

export OPENAI_API_KEY=sk-...
xelo scan ./my-repo --llm --llm-model gpt-4o-mini --output sbom.json

Validate a produced SBOM against the bundled schema:

xelo validate sbom.json
# OK — document is valid

Print or save the JSON Schema:

xelo schema                            # print to stdout
xelo schema --output aibom.schema.json # write to file

CLI alias: ai-sbom. Run xelo --help for all flags.

Output Formats

Flag Format
--format json (default) Xelo-native AI SBOM (see schema docs)
--format cyclonedx CycloneDX 1.6 JSON (AI components only)
--format unified CycloneDX merged with standard dependency SBOM

Validate a produced document:

xelo validate sbom.json

Print the JSON schema:

xelo schema

Toolbox Plugins

Xelo ships with built-in analysis plugins invoked via xelo plugin run:

xelo plugin list                                          # list all plugins

xelo plugin run vulnerability sbom.json                   # offline VLA rules
xelo plugin run atlas sbom.json --output atlas.json       # MITRE ATLAS annotation
xelo plugin run sarif sbom.json --output results.sarif    # SARIF 2.1.0
xelo plugin run markdown sbom.json --output report.md     # Markdown report
xelo plugin run cyclonedx sbom.json --output bom.cdx.json # CycloneDX 1.6
Plugin CLI name Network What it does
VulnerabilityScannerPlugin vulnerability No Structural VLA rules — missing guardrails, unprotected models, over-privileged agents
AtlasAnnotatorPlugin atlas No Maps every finding to MITRE ATLAS v2 techniques and mitigations
LicenseCheckerPlugin license No Checks dependency licence compliance
DependencyAnalyzerPlugin dependency No Scores dependency freshness and flags outdated AI packages
SarifExporterPlugin sarif No Exports findings as SARIF 2.1.0 (GitHub Code Scanning / GHAS compatible)
CycloneDxExporter cyclonedx No Exports nodes as CycloneDX 1.6
MarkdownExporterPlugin markdown No Human-readable Markdown report
GhasUploaderPlugin ghas Yes Uploads SARIF to GitHub Advanced Security
AwsSecurityHubPlugin aws-security-hub Yes Pushes findings to AWS Security Hub (requires boto3)
XrayPlugin xray Yes Pushes findings to JFrog Xray

Plugins are also importable as a Python library:

import json
from xelo import AiSbomExtractor, AiSbomConfig
from xelo.toolbox.plugins.vulnerability import VulnerabilityScannerPlugin
from xelo.toolbox.plugins.atlas_annotator import AtlasAnnotatorPlugin
from xelo.toolbox.plugins.sarif_exporter import SarifExporterPlugin
from xelo.toolbox.plugins.markdown_exporter import MarkdownExporterPlugin

doc = AiSbomExtractor().extract_from_path("./my-repo", config=AiSbomConfig())
sbom = doc.model_dump(mode="json")

vuln = VulnerabilityScannerPlugin().run(sbom, {})
print(vuln.status, vuln.message)

atlas = AtlasAnnotatorPlugin().run(sbom, {})
for finding in atlas.details["findings"]:
    print(finding["rule_id"], finding["severity"], finding["atlas"]["techniques"])

sarif = SarifExporterPlugin().run(sbom, {})
open("results.sarif", "w").write(json.dumps(sarif.details, indent=2))

md = MarkdownExporterPlugin().run(sbom, {})
open("report.md", "w").write(md.details["markdown"])

To add custom detection adapters (extending framework coverage), subclass xelo.plugins.PluginAdapter and register under the xelo.plugins entry-point group. Enable at scan time with AiSbomExtractor(load_plugins=True). See the Developer Guide for details.

Configuration

CLI flags take precedence over environment variables.

Variable Purpose Default
XELO_LLM Enable LLM enrichment (true/1) false
XELO_LLM_MODEL LLM model passed to litellm gpt-4o-mini
XELO_LLM_API_KEY API key (or use provider-native env vars) —
XELO_LLM_API_BASE Base URL for self-hosted / proxy endpoints —
XELO_LLM_BUDGET_TOKENS Max tokens for enrichment 50000

Legacy AISBOM_* names are accepted as fallbacks.

Development

pip install -e ".[dev]"
ruff check src tests   # lint
mypy src               # type-check
pytest                 # all tests
pytest -m "not smoke"  # skip network-dependent tests

Run the benchmark evaluation suite against cached fixtures:

python -m tests.test_toolbox.evaluate --all --mode local --verbose

Documentation

License

Apache-2.0. See LICENSE.

Disclaimer

See XELO-Disclaimer.md.

Metadata

Release files for xelo 0.7.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xelo 0.7.2
File Size Uploaded Provenance
xelo-0.7.2.tar.gz 277.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for xelo 0.7.2
File Interpreter ABI Platform
xelo-0.7.2-py3-none-any.whl Python 3 none any Details

Total release size: 559.2 kB

Release files / xelo-0.7.2.tar.gz

Download URL xelo-0.7.2.tar.gz
Size 277.8 kB
Tags Source
SHA-256 checksum
How to use checksums
136cda2a8831e003e2747bc39a739cef5e1769892a5a0dc0ca1a93d53d478bf8
BLAKE2b-256 checksum
How to use checksums
c2b702f374f1bb2d2d7acd9cd359a105be139422d90c83bd089ead12b6c5992b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.14

Release files / xelo-0.7.2-py3-none-any.whl

Download URL xelo-0.7.2-py3-none-any.whl
Size 281.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
eada2e2391c5a5282265de58d6f7a0588f9341a86b499ef007839b8c148ca4f3
BLAKE2b-256 checksum
How to use checksums
26bba31738bc8fe89d210abaea80ca658c6bbfba966414cf33ed6c9624569175
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.14

Security for xelo 0.7.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page