Install Extras Matrix
This page lists every optional extra — for each, the component slot it serves, the implementation(s) it enables, and the packages it pulls in.
The guiding rule: pip install indx stays light. Core carries no cloud SDKs, no vector-DB clients, and no heavy parsing toolchains. Anything expensive is opt-in. The documented model defaults use cloud adapters once their extras are installed, and the local profile stays available for air-gapped runs.
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 has been in the Python standard library since 3.11, and 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 need an extra. A full end-to-end run is therefore possible 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 maps each extra to the packages its implementation needs, under [project.optional-dependencies]. The “Pulls” column shows 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-cloud-services |
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[litellm] | llm / embed | LiteLLMClient, LiteLLMEmbedder | litellm (one client for 100+ providers, on-prem + AWS/Azure/GCP/cloud) |
indx[azure] | llm / vlm / embed / parser / store | AzureOpenAILLM, AzureOpenAIVLM, AzureOpenAIEmbedder, DocumentIntelligenceParser, AzureAISearchStore | openai, azure-ai-documentintelligence, azure-search-documents, azure-identity, azure-core |
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[aws] | parser / llm / vlm / embed / store | TextractParser, BedrockLLM, BedrockVLM, BedrockEmbedder, S3VectorsStore | boto3>=1.40 |
indx[aws-opensearch] | store | OpenSearchStore | indx[aws], opensearch-py>=2.4 |
indx[gcp] | parser / llm / vlm / embed / store | DocumentAIParser, VertexLLM, VertexVLM, VertexEmbedder, BigQueryStore | google-genai>=1.0, google-cloud-documentai>=2.20, google-cloud-bigquery>=3.20 |
indx[gcp-vectorsearch] | store | VertexVectorStore | indx[gcp], google-cloud-aiplatform>=1.50 |
indx[langchain] | output / agent | LangChainWriter; LangChain agent tools + retriever | langchain-core |
indx[llamaindex] | output | LlamaIndexWriter | llama-index-core |
indx[mcp] | agent | MCP server (indx mcp); KnowledgeConnector.mcp() | fastmcp>=2.0, falls back to the FastMCP bundled in the mcp SDK |
indx[pydantic-ai] | agent | Pydantic AI tools | pydantic-ai-slim |
indx[openai-agents] | agent | OpenAI Agents SDK function tools | openai-agents |
indx[claude-agent] | agent | Claude Agent SDK in-process MCP server | claude-agent-sdk |
indx[agent] | agent (bundle) | every framework adapter + the MCP server | union of the agent extras + langchain |
indx[local] / indx[defaults] | bundle | docling + ollama + bge-m3 + qdrant (the local profile) | the local / air-gapped stack |
indx[all] | bundle | everything above + all cloud stacks | union of all extras (including aws, aws-opensearch, azure, gcp, gcp-vectorsearch) |
Bundles
Section titled “Bundles”Two convenience bundles install groups of extras in one command:
| Bundle | Installs | Use when |
|---|---|---|
indx[local] | docling + ollama + bge + qdrant | You want the local profile 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. Installing either pulls the local profile: Docling, Ollama qwen2.5, BGE-M3, and Qdrant.
# Opt-in local profile (air-gapped stack): Docling, 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]"AI-agent connectors
Section titled “AI-agent connectors”The indx.agent package turns a built .indx archive into live tools for an AI agent. Each framework adapter is gated behind its own extra; indx[agent] installs them all (plus the MCP server).
pip install "indx[agent]" # every adapter + the MCP serverpip install "indx[mcp]" # just the universal MCP server (Mastra, Cursor, Claude Desktop…)The langchain extra does double duty: it powers both the build-time langchain output writer and the LangChain agent connector (both ride on langchain-core). See the AI agents guide.
Cloud profile extras
Section titled “Cloud profile extras”Three extras bundle a complete single-vendor pipeline — parser, LLM, VLM, embedder, and vector store — all satisfied by one cloud’s managed services. Install one extra, pass the matching CLI flag, and every slot is filled automatically (explicit flags still win; see CLI reference).
pip install "indx[aws]" # Textract · Bedrock · Titan · S3 Vectorspip install "indx[azure]" # Document Intelligence · Azure OpenAI · Azure AI Searchpip install "indx[gcp]" # Document AI · Vertex AI (Gemini) · gemini-embedding-001 · BigQuerySDK version pins
Section titled “SDK version pins”Each cloud’s SDK is gated behind an extra and is never pulled by a bare pip install indx.
| Extra | Key SDK dependency | Notes |
|---|---|---|
indx[aws] | boto3>=1.40 | boto3 is the single SDK for Bedrock, Textract, and S3 Vectors. boto3>=1.40 is required for the S3 Vectors client (GA 2025-12). Older versions lack the s3vectors service client and raise a clear upgrade prompt at runtime. |
indx[aws-opensearch] | opensearch-py>=2.4 | Adds the opt-in OpenSearch Serverless store on top of indx[aws]. Use this when you need lower-latency ANN search. |
indx[azure] | openai>=1.40, azure-ai-documentintelligence>=1.0.0, azure-search-documents>=11.5.0, azure-identity>=1.16, azure-core>=1.30 | Widened from the previous ["openai"] definition. The extra now covers the full Azure stack. The openai package stays at the same pin it already required; the Azure service SDKs are additive. azure-ai-documentintelligence>=1.0.0 is required for the body= argument shape (pre-1.0.0 betas used a different parameter). azure-search-documents>=11.5.0 is required for the vector-search profile classes. azure-identity enables DefaultAzureCredential (managed-identity / az login) when no API-key env var is set. |
indx[gcp] | google-genai>=1.0, google-cloud-documentai>=2.20, google-cloud-bigquery>=3.20 | google-genai is the unified SDK for Vertex AI Gemini (LLM, VLM, and embedder slots). The deprecated vertexai.generative_models classes are not used. |
indx[gcp-vectorsearch] | google-cloud-aiplatform>=1.50 | Adds Vertex Vector Search on top of indx[gcp]. Vertex Vector Search requires deploying an index to an endpoint before querying (a 20–60 minute operation); the default GCP store (bigquery) has no such requirement. |
Default and opt-in stores per cloud
Section titled “Default and opt-in stores per cloud”| Cloud | Default store | Opt-in store | Why the split |
|---|---|---|---|
| AWS | s3vectors (indx[aws]) | opensearch (indx[aws-opensearch]) | S3 Vectors needs only boto3; OpenSearch Serverless requires opensearch-py plus extra IAM data-access policies. S3 Vectors is zero-infra and ~90 % cheaper; OpenSearch gives lower latency and higher QPS. |
| Azure | azure-search (indx[azure]) | — (Azure AI Search is the only native option) | All Azure service SDKs are already in indx[azure]. |
| GCP | bigquery (indx[gcp]) | vertex-vector (indx[gcp-vectorsearch]) | BigQuery is serverless with no endpoint to deploy; Vertex Vector Search requires a long-running, always-billed endpoint. BigQuery maps cleanly to upsert/search/delete at seconds-scale latency. |
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. Selecting the Qdrant store without indx[qdrant] installed yields:
MissingExtraError: store 'qdrant' requires the 'qdrant' extra: 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.