feat: Add support for scanning GGUF models from OCI registries#4335
Merged
feat: Add support for scanning GGUF models from OCI registries#4335
Conversation
9c5279c to
b18f7bb
Compare
5853129 to
8031957
Compare
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
Contributor
wagoodman
left a comment
There was a problem hiding this comment.
we should take a pass to unexport whatever doesn't need to be in the public API
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
wagoodman
reviewed
Dec 19, 2025
Contributor
Author
|
First big change to make here is how the Provider and Source interact. Provider should be thin and call Source, Source should do most of the work, provider should return the source.Source answer. |
4fc836b to
a4ef861
Compare
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
wagoodman
reviewed
Dec 23, 2025
Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
5c6a10e to
9026b8a
Compare
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
…into 4184-pt2-oci-model-support * '4184-pt2-oci-model-support' of github.com:anchore/syft: fix generation to account for self referential types
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
…into 4184-pt2-oci-model-support * '4184-pt2-oci-model-support' of github.com:anchore/syft: orient pkg metadata names by display name not type name Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Christopher Phillips <32073428+spiffcs@users.noreply.github.com>
Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
…l-support * 'main' of github.com:anchore/syft: chore(deps): bump the actions-minor-patch group across 2 directories with 3 updates (#4568) chore(deps): bump the go-minor-patch group with 6 updates (#4567) chore(deps): update tools to latest versions (#4565) chore(deps): bump github.com/spdx/tools-golang (#4557) ci: enable zizmor to fail PRs (#4556) Chore new slack action (#4553) chore(deps): update anchore dependencies (#4552) chore(deps): update tools to latest versions (#4551) chore(deps): update tools to latest versions (#4545) chore(deps): update tools to latest versions (#4542) chore(deps): bump the go-minor-patch group with 4 updates (#4543) chore(deps): bump anchore/sbom-action (#4544)
wagoodman
approved these changes
Feb 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR follows up on #4279 by adding support for a new source type.
With this change users can do the following:
syft -o json docker.io/ai/qwen3-vl | jq .:They'll get an SBOM with a single package showing the gguf model and details for the model pulled from
https://hub.docker.com/u/aiExample of metadata extracted
This PR adds support for scanning OCI model artifacts (specifically GGUF-based AI models) stored in OCI registries. The
implementation enables Syft to extract SBOM information from AI models without downloading the entire model file—only
the GGUF headers are fetched using a lazy reader that closes after we've read all the header bytes.
Key changes:
OCI Model Source
This new source type enables scanning AI models stored as OCI artifacts in container registries (like Docker Hub or other OCI registries).
How it works:
application/vnd.docker.ai.model.config.*
only the first 8MB containing the GGUF header metadata. The download is terminated early by closing the reader after
reading the header bytes.
closed.
allowing catalogers to discover layers by OCI media type (application/vnd.docker.ai.gguf.v3) rather than filesystem
paths.
provider chain—so normal container images are handled first, and this kicks in only for artifacts with model-specific
media types. It also makes it so that for syft's current MOST common cases (non ai containers) we're not adding extra work.
Keys Goals: