Skip to content

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.

A plain pip install indx carries only a small set of pure-Python (and one compiled-wheel) dependencies:

PackageWhy it’s in core
Pydantic v2All boundary-crossing data models (config, manifest, documents, chunks, relations)
TyperBuilds the typed CLI command tree
RichTerminal rendering — progress bars, tables for indx inspect, tracebacks
ClickUnderlies Typer’s parsing and completion
pydantic-settingsLayers 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).

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:

SlotFallback (in core)Behaviour
parserplaintextReads files as plain text — no Docling/Torch needed
storejsonlVectors and metadata written inline; brute-force linear search
vlmnoneSkips vision enrichment entirely (this is also the default VLM)
output writer.indx and jsonlSelf-contained archive, or newline-delimited documents/chunks

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 …SlotImplementation(s) enabledPulls (illustrative)
indx[docling]parserDoclingParserdocling
indx[unstructured]parserUnstructuredParserunstructured
indx[llamaparse]parserLlamaParseParserllama-parse
indx[markitdown]parserMarkItDownParsermarkitdown
indx[ollama]llm / vlmOllamaLLMollama
indx[vllm]llmVLLMClientvllm, openai (OpenAI-compatible API)
indx[openai]llm / vlm / embedOpenAILLM, GPT4oVLM, OpenAIEmbedderopenai
indx[anthropic]llmAnthropicLLManthropic
indx[azure]llmAzureOpenAILLMopenai (Azure endpoint config)
indx[qwen-vl]vlmQwenVLClienttransformers, torch, qwen-vl-utils
indx[vlm-local]vlmLocalVLMhttpx
indx[bge]embedBGEM3Embedder (name: bge-m3)FlagEmbedding, torch
indx[e5]embedE5Embeddersentence-transformers, torch
indx[cohere]embedCohereEmbeddercohere
indx[qdrant]storeQdrantStoreqdrant-client
indx[pgvector]storePgVectorStorepsycopg[binary], pgvector
indx[chroma]storeChromaStorechromadb
indx[lancedb]storeLanceDBStorelancedb
indx[langchain]outputLangChainWriterlangchain-core
indx[llamaindex]outputLlamaIndexWriterllama-index-core
indx[local] / indx[defaults]bundleollama + bge-m3 + qdrant (the local profile)the local / air-gapped stack
indx[all]bundleeverything aboveunion of all extras

Two convenience bundles install groups of extras in one command:

BundleInstallsUse when
indx[local]ollama + bge + qdrantYou want the local profile (opt-in) — the recommended air-gapped stack — in one line.
indx[all]The union of every extra aboveCI, 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).

Terminal window
# Opt-in local profile (air-gapped stack): Ollama (qwen2.5), BGE-M3, Qdrant
# indx[local] and indx[defaults] are aliases for the same bundle
pip install "indx[local]"
# Everything, for CI or experimentation
pip install "indx[all]"
# Or compose exactly what you need
pip install "indx[markitdown,openai,chroma]"

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.

If you’d rather choose deliberately than install a bundle, each slot has a dedicated guide that weighs the options:

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.