Feature Extractors
After your data is connected, extractors run in parallel to pull out structured features, embeddings, entities, transcripts, and more.
11 production extractors, each with a README, a live schema, and a Studio path
Web Scraper + Multimodal Embeddings
Crawl sites (docs, job boards, news, SPAs) and extract text, code & image embeddings in one pass.
Text Embeddings (E5-Large)
Multilingual dense text embeddings with E5-Large: semantic search & RAG out of the box.
Image Embeddings (SigLIP)
Dense 768-D image embeddings with Google SigLIP: text-to-image search in one contrastive space.
Multimodal Video/Audio/Image (Vertex v1 · Gemini v2)
Unified embeddings for video, audio, image & text: FFmpeg scene/silence chunking, Whisper transcription, thumbnails.
Universal All-in-One (Gemini)
One extractor for image, video, audio & documents: auto-detects modality and applies the right pipeline.
Multi-File Object Embeddings (Gemini)
Embed ALL files of an object (images, PDFs, video, audio, text) into one 3072-D Gemini vector.
Document Layout Graph
Decompose PDFs into spatial blocks: paragraphs, tables, forms, headers: with layout classification & confidence.
Passthrough (Storage Only)
Store and canonicalize objects with zero ML: metadata-only ingestion.
Scrolling/Marquee Text OCR
Reads scrolling video text via phase-correlation band detection, panoramic stitching, and VLM OCR.
Face Identity (SCRFD + ArcFace)
Production face recognition: detect, align, and embed faces to 512-D ArcFace vectors across image, video & PDF.
Audio Fingerprinting (CLAP)
512-D audio embeddings with CLAP: content-based audio search and matching from files or video tracks.
What's new in extractors
Full changelog- Aug 1, 2026Splitting text by sentences now counts sentencesWith `split_by: sentences`, `chunk_size` was measured in characters while every other split mode measured it in units of the split itself. A request for chunks of 6 sentences asked for chunks of 6 characters, and since every sentence is longer than that, each sentence became its own chunk. Asking for 12 produced the same result, so two different configurations built identical indexes. The extractor's own documented example used values that only make sense as sentence counts, so anyone following it inherited the behaviour. Sentences now group by sentence count, matching the documented example and the other four split modes. Collections report their realised chunk statistics, including the unit actually applied, so a setting that does nothing is visible without comparing two indexes.
- Jul 30, 2026The web scraper gets through reCAPTCHA v2 gatesScrapes that hit a reCAPTCHA v2 interstitial used to stop there. The scraper now detects the gate, extracts the sitekey, solves it, injects the token and fires the widget callback. One case needed more than that. Form-style gates run a callback that clears error state without submitting anything, so the page sat on the gate even though every step had worked. When the callback leaves the page un-navigated and still thin, the widget's enclosing form is submitted directly, bypassing client validation that can swallow a programmatic submit. Pages whose callback does navigate are left alone. The JS render path was also brought to parity so the same gate handling applies whether or not the page needs rendering.
- Jul 29, 2026One blocked page no longer fails every other URL in the scrapeA failed scrape leaves its columns empty, and pandas fills those with NaN floats. The document expander then sliced and measured them as if they were strings and lists, so a single unreachable page crashed the processor for the entire Ray batch. Observed on a four-URL run where one publisher's captcha took down the three siblings that had scraped perfectly. The subtle part is why the obvious guard did not help: `x or []` does not rescue a NaN, because NaN is truthy, so it returns the NaN and the length check still raises. Every column the expander touches is now normalised once, up front, so a blocked page fails only itself.
- Jul 29, 2026Scraping JavaScript pages no longer runs out of memory mid-runThe scraper's headless Chromium was landing on a 6 GiB worker and getting OOM-killed, which showed up as a scrape that simply died rather than an error you could act on. Sizing is now explicit: one URL per actor call so a call means exactly one browser session, and a memory reservation large enough that two sessions can never share a pod. The extractor runs on a dedicated 16 GiB profile applied at the worker level, deliberately without changing its tier, so a browser-heavy extractor does not get pulled onto the shared cluster as a side effect.