Observed since 21 Oct, 10:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
ai-finder
AI Finder - AI artifact scanner for supply chain security
AI artifact scanner for supply chain security and compliance
ai-finder detects AI/ML artifacts in codebases for:
| Language | SDKs Detected |
|---|---|
| Python | OpenAI, Anthropic, HuggingFace, LangChain, LlamaIndex, Strands, CrewAI, AutoGen |
| JavaScript/TypeScript | OpenAI, Anthropic, LangChain, Vercel AI SDK |
| Go | go-openai, go-anthropic |
| Rust | async-openai, anthropic-rs |
| Java/Kotlin | openai-java, LangChain4j, Spring AI |
| And more... | Ruby, PHP, C#, C++, Swift, Scala, Kotlin |
Comprehensive detection across categories:
| Category | Packages |
|---|---|
| LLM Clients | OpenAI, Anthropic, Cohere, Groq, Mistral, Ollama, Google GenAI, Azure OpenAI |
| Agent Frameworks | LangChain, LlamaIndex, Strands Agents, CrewAI, AutoGen, Semantic Kernel |
| ML Frameworks | PyTorch, TensorFlow, Keras, JAX, Transformers, scikit-learn, XGBoost |
| Vector Databases | ChromaDB, Pinecone, Weaviate, Qdrant, Milvus, FAISS, LanceDB |
| Speech/Audio AI | OpenAI Whisper, Faster Whisper, ElevenLabs, Bark |
| AI Safety | AIProxyGuard, Guardrails AI, NeMo Guardrails, LLM Guard |
| Tools & Utilities | Tavily, LangSmith, W&B, MLflow, Accelerate, Datasets |
| MCP/Tool Use | MCP, Anthropic Tools |
GGUF, SafeTensors, ONNX, PyTorch, TensorFlow, TFLite, CoreML, JAX, Keras, MXNet, PaddlePaddle, Pickle
requirements.txt, pyproject.toml, package.json, go.mod, Cargo.toml, pom.xml, build.gradle, Gemfile, composer.json, *.csproj, Package.swift
NOASSERTION per SPDX specificationpip install ai-finder
Requires Python 3.9 or later.
# Scan a directory
ai-finder scan /path/to/project
# Generate SBOM (CycloneDX)
ai-finder scan /path/to/project -f cyclonedx -o sbom.json
# Generate SBOM (SPDX)
ai-finder scan /path/to/project -f spdx -o sbom.spdx.json
# Identify a model file
ai-finder identify model.gguf
# Initialize local KB
ai-finder kb init
# Lookup model by PURL
ai-finder kb lookup pkg:huggingface/TinyLlama/TinyLlama-1.1B-Chat-v1.0
This tool collects anonymous usage telemetry to help improve the product. No file paths, code content, or scan targets are collected.
Disable telemetry:
# Per-session
ai-finder --no-telemetry scan .
# Environment variable
export AI_FINDER_TELEMETRY=0
# Or use the standard
export DO_NOT_TRACK=1
See docs/TELEMETRY.md for full details on what is collected.
# Clone repository
git clone https://github.com/scanoss/ai-finder.git
cd ai-finder
# Install with uv
uv sync --all-packages --all-extras
# Run tests
uv run pytest
# Lint
uv run ruff check .
We welcome contributions! Please read CONTRIBUTING.md before submitting a pull request.
If you discover a security vulnerability, please follow our Security Policy.
This project is licensed under the MIT License - see LICENSE for details.
Copyright (c) 2026 SCANOSS.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
clickEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | click>=8.0 | runtime |
ossliliEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | osslili>=1.6 | runtime |
ptelemetryEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | ptelemetry>=0.2.2 | runtime |
python-levenshteinEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | python-levenshtein>=0.25.1 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0 | runtime |
requestsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | requests>=2.28 | runtime |
tomliEnvironment{
"extras": "",
"marker": "python_version < \"3.11\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tomli>=2.0; python_version < "3.11" | runtime |
tqdmEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tqdm>=4.65 | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=4.0; extra == "dev" | runtime |
pytest-mockEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytest-mock>=3.10; extra == "dev" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.0; extra == "dev" | runtime |
python-tlshEnvironment{
"extras": "",
"marker": "extra == \"fuzzy\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | python-tlsh>=4.5.0; extra == "fuzzy" | runtime |
tree-sitter-c-sharpEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-c-sharp>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-cppEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-cpp>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-goEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-go>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-javaEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-java>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-javascriptEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-javascript>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-phpEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-php>=0.22; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-pythonEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-python>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-rubyEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-ruby>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-rustEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-rust>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitter-typescriptEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-typescript>=0.21; python_version >= "3.10" and extra == "relationships" | runtime |
tree-sitterEnvironment{
"extras": "",
"marker": "python_version >= \"3.10\" and extra == \"relationships\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | tree-sitter>=0.22; python_version >= "3.10" and extra == "relationships" | runtime |
bdist_wheel · 219.64 KB · Python py3
sdist · 230.85 KB · Python source
Observed since 21 Oct, 10:42 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:f1fce8912bc931806d400c6683caa6f4857f50bbb39e120cc5e5d62cbc4a9ec7