Skip to main content
Custom extractors extend the warehouse’s Decompose layer with your own feature extraction logic. For the full reference, see Custom Extractors.

What You’ll Build

A custom text embedding extractor that:
  1. Generates 128-dimensional embeddings from text (batch + real-time)
  2. Validates locally with lint and test — no API key needed
  3. Powers search through a retriever
Where this runs. Authoring + lint + test work everywhere. The upload/deploy steps require a dedicated deployment — the shared api.mixpeek.com API does not expose custom-extractor uploads. On the shared API, swap in a built-in extractor (e.g. text_extractor) at Step 4 and skip Step 3, or ship your extractor via Submissions. The ingest + search steps (4–5) run on any plan.
Set these first:
These are the same three variables the plugins.py CLI reads, so the CLI and the raw curl examples below use one consistent convention.

Step 1: Create Extractor Files

Create a directory text_embed/ with three files.

manifest.py

Use the exact key names: feature_type, feature_name, embedding_dim, distance_metric. Using name/type/dimensions/distance will silently produce a collection with no vector indexes.

pipeline.py

Always read from batch["data"] — NOT batch["text"]. The data column holds raw text for text blobs and S3 URLs for binary blobs. The local test harness feeds the same data column, so a passing test matches production.

realtime.py

Embeds the query at search time so it lands in the same space as your indexed vectors.

Step 2: Validate Locally (no API key)

lint validates your manifest + runs the security scanner. test runs the pipeline through real Ray Data map_batches and confirms your output column is populated. Both are offline.

Step 3: Deploy (dedicated infrastructure)

Upload/deploy is only available on a dedicated deployment — full HTTP contract in the Custom Extractor API reference. On the shared API, skip to Step 4 with a built-in extractor, or use Submissions.
The CLI does this for you (plugins.py push then deploy). Raw HTTP (custom extractors are addressed as /plugins on this surface):

Step 4: Ingest Data

Buckets, collections, retrievers, and batches are top-level resources keyed by the X-Namespace header — not nested under /namespaces/{ns}/.
First-run cold start. On a cold engine the embedding model can take several minutes to load. The batch poll in Step 4 waits for the ingest side, but the first execute immediately after may return 0 results (with status completed or degraded) while the query-side model warms up. This is expected on the first call only — retry after a few seconds and subsequent searches return ranked results. A warm namespace responds immediately.
The execute body is {"inputs": {"query": "..."}}. The feature_uri must match your extractor + feature name (for a built-in, fetch it from GET /v1/namespaces/$MIXPEEK_NAMESPACE/extractors/{extractor_id}).

Next Steps