Install Extras Matrix
indx keeps its core tiny and installs everything heavy or cloud-bound as an optional extra. This page is the authoritative list of every extra, the component slot it serves, the implementation(s) it unlocks, and the packages it pulls in.
The guiding rule: pip install indx must stay light: no cloud SDKs, no vector-DB clients, and no heavy parsing toolchains in core. Anything expensive is opt-in. The documented model defaults use cloud adapters when their extras are installed, while the local profile remains explicitly available for air-gapped runs. See Installation for the practical install paths and Registry & Defaults for how names like parser = "docling" resolve to these implementations.
What the bare install pulls
Section titled “What the bare install pulls”A plain pip install indx carries only a small set of pure-Python (and one compiled-wheel) dependencies:
| Package | Why it’s in core |
|---|---|
| Pydantic v2 | All boundary-crossing data models (config, manifest, documents, chunks, relations) |
| Typer | Builds the typed CLI command tree |
| Rich | Terminal rendering — progress bars, tables for indx inspect, tracebacks |
| Click | Underlies Typer’s parsing and completion |
| pydantic-settings | Layers config sources: defaults → indx.toml → env vars → CLI flags |
TOML parsing needs no dependency: tomllib is in the Python standard library from 3.11 onward (indx requires Python 3.11–3.13).
Zero-dependency fallbacks (ship in core)
Section titled “Zero-dependency fallbacks (ship in core)”The bare install is not just a skeleton — it ships working fallbacks for every slot that would otherwise require an extra, so a full end-to-end run is possible completely offline with nothing but pip install indx:
| Slot | Fallback (in core) | Behaviour |
|---|---|---|
| parser | plaintext | Reads files as plain text — no Docling/Torch needed |
| store | jsonl | Vectors and metadata written inline; brute-force linear search |
| vlm | none | Skips vision enrichment entirely (this is also the default VLM) |
| output writer | .indx and jsonl | Self-contained archive, or newline-delimited documents/chunks |
The full extras matrix
Section titled “The full extras matrix”pyproject.toml ([project.optional-dependencies]) maps each extra to the packages its implementation needs. The “Pulls” column is illustrative of the headline dependency each extra brings in.
pip install … | Slot | Implementation(s) enabled | Pulls (illustrative) |
|---|---|---|---|
indx[docling] | parser | DoclingParser | docling |
indx[unstructured] | parser | UnstructuredParser | unstructured |
indx[llamaparse] | parser | LlamaParseParser | llama-parse |
indx[markitdown] | parser | MarkItDownParser | markitdown |
indx[ollama] | llm / vlm | OllamaLLM | ollama |
indx[vllm] | llm | VLLMClient | vllm, openai (OpenAI-compatible API) |
indx[openai] | llm / vlm / embed | OpenAILLM, GPT4oVLM, OpenAIEmbedder | openai |
indx[anthropic] | llm | AnthropicLLM | anthropic |
indx[azure] | llm | AzureOpenAILLM | openai (Azure endpoint config) |
indx[qwen-vl] | vlm | QwenVLClient | transformers, torch, qwen-vl-utils |
indx[vlm-local] | vlm | LocalVLM | httpx |
indx[bge] | embed | BGEM3Embedder (name: bge-m3) | FlagEmbedding, torch |
indx[e5] | embed | E5Embedder | sentence-transformers, torch |
indx[cohere] | embed | CohereEmbedder | cohere |
indx[qdrant] | store | QdrantStore | qdrant-client |
indx[pgvector] | store | PgVectorStore | psycopg[binary], pgvector |
indx[chroma] | store | ChromaStore | chromadb |
indx[lancedb] | store | LanceDBStore | lancedb |
indx[langchain] | output | LangChainWriter | langchain-core |
indx[llamaindex] | output | LlamaIndexWriter | llama-index-core |
indx[local] / indx[defaults] | bundle | ollama + bge-m3 + qdrant (the local profile) | the local / air-gapped stack |
indx[all] | bundle | everything above | union of all extras |
Bundles
Section titled “Bundles”Two convenience bundles install groups of extras in one command:
| Bundle | Installs | Use when |
|---|---|---|
indx[local] | ollama + bge + qdrant | You want the local profile (opt-in) — the recommended air-gapped stack — in one line. |
indx[all] | The union of every extra above | CI, exploration, or trying every backend. |
indx[local] and indx[defaults] are aliases for the same local bundle — install either to pull the opt-in local profile (Ollama qwen2.5, BGE-M3, Qdrant).
# Opt-in local profile (air-gapped stack): Ollama (qwen2.5), BGE-M3, Qdrant# indx[local] and indx[defaults] are aliases for the same bundlepip install "indx[local]"
# Everything, for CI or experimentationpip install "indx[all]"
# Or compose exactly what you needpip install "indx[markitdown,openai,chroma]"Missing extras: MissingDependencyError
Section titled “Missing extras: MissingDependencyError”Because the registry only ever imports concrete implementations lazily, a missing extra never breaks an unrelated code path. The error surfaces only when you actually select that slot.
When an implementation module is imported without its extra installed, the utils.lazy.require_extra(...) helper raises a single, actionable error. For example, selecting the Qdrant store without indx[qdrant] installed yields:
MissingDependencyError: store 'qdrant' requires: pip install indx[qdrant]The message always names the slot, the selected implementation, and the exact pip install indx[...] command to fix it. MissingDependencyError is part of the shared exception hierarchy rooted at IndxError — see Errors & exit codes.
Picking extras per slot
Section titled “Picking extras per slot”If you’d rather choose deliberately than install a bundle, each slot has a dedicated guide that weighs the options:
- Parsers: Choosing a parser
- LLM / VLM enrichment: Enrichment with LLM & VLM
- Embedders: Choosing an embedder
- Stores: Choosing a store
- Output writers: Output formats
For how a name in indx.toml resolves to one of these classes — and how third-party plugins register their own — see Registry & Defaults and Configuration.