Skip to main content
Ingest unstructured documents into Chroma, a lightweight, developer-friendly open-source vector database. The pipeline extracts text from the document, chunks it using a configurable strategy, generates vector embeddings, and upserts the chunks with metadata into a Chroma collection via its REST API. Chroma is the simplest vector database to set up — a single Docker container with no external dependencies.

Configuration

Supported File Types

For structured data (CSV, JSON, XML), use database destinations (PostgreSQL, MongoDB) instead.

Vault Secrets

Chroma connection

Chroma does not require authentication by default. For Chroma Cloud or authenticated instances, add token-based auth to the loader as needed.

Embedding API

The embedding secret is server-level (ai.embedding.secretName, default oss/embedding) and is seeded automatically by docker/vault-init.sh. You only need to write it manually if you want to point at a different embedding provider. See AI Configuration for the full picture.
For Anthropic-only deployments, the bundled TEI sidecar serves bge-m3 (1024-dim) and vault-init.sh seeds the embedding secret to point at it — no OpenAI key required.

Chunking Strategies

Documents are split into chunks before embedding. Each chunk becomes a separate entry in the Chroma collection with the document’s metadata plus chunk_index, filename, and source_pipeline fields.
  • chunkSize (default 500): maximum characters per chunk
  • chunkOverlap (default 50): characters of overlap between consecutive chunks

Metadata

Static metadata is stored on every chunk in the Chroma collection:
This allows filtered queries combining similarity with metadata predicates using Chroma’s where clause. Every entry automatically includes:
  • text — the chunk text (stored as Chroma document)
  • chunk_index — position of the chunk in the document
  • filename — original uploaded filename
  • source_pipeline — pipeline name

How It Works

  1. Upload — an unstructured file is uploaded via POST /api/v1/pipeline/upload
  2. Extract — text is extracted from the document
  3. Chunk — text is split into chunks using the configured strategy
  4. Embed — each chunk is sent to the embedding API to generate a vector
  5. Upsert — vectors are upserted into the Chroma collection via REST API with metadata
  6. Notify — a pipeline notification is published on completion
The collection is auto-created on first upsert with cosine distance. No Java client library is needed — the loader communicates with Chroma’s REST API directly via HTTP.

Running Chroma

Chroma ships as a bundled opt-in Compose service. Enable it with one line in .env:
Then start the stack:
Combine profiles with commas (e.g., COMPOSE_PROFILES=chroma,kafka). The install.sh installer can also enable Chroma at install time — it writes the profile and seeds the oss/chroma secret for you. For the bundled container, use the compose service name as the host in the secret (host="chroma", port 8000). To use an existing external instance instead, skip the profile and point the oss/chroma secret’s host/port at it — the secret fields are the same either way. You can also run Chroma standalone:
Either way there are no external dependencies like etcd or MinIO — Chroma is the simplest vector database to run.

Verifying