Feature Extractors
After your data is connected, extractors run in parallel to pull out structured features, embeddings, entities, transcripts, and more.
12 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.
Transcoding
Video transcoding to H.264/H.265 MP4.
What's new in extractors
Full changelog- Sep 14, 2026Web scraper batches that write nothing say why on the batch recordA web_scraper batch that wrote zero documents said rows may have been filtered, even when its own counters showed nothing was skipped. Scraper errors now reach the batch record after a worker restart, each invalid URL is recorded as a skipped row, and the zero-documents message states what the counters support: every row skipped, or errors the batch could not report.
- Aug 30, 2026multimodal_extractor_v2 was skipping every image and text objectA collection built on multimodal_extractor_v2 over images produced zero documents and reported no failures, which reads as an empty source rather than a bug. The media-streaming wrapper around the extractor checked for a video segment column, found the placeholder that image and text rows carry for schema alignment in mixed batches, and treated each row as a failed video segment: it passed the row through without running the extractor, so those objects never reached the path that would have downloaded and embedded them. The wrapper now splits three ways, routing rows positively identified as image or text to the extractor directly. The same skip was behind image description and OCR going missing, so both come back with it.
- Aug 29, 2026A large batch on a Celery-native extractor is chunked instead of rejectedA scheduled sync of 1,120 objects failed on every run for three weeks. The extractor runs on Celery with no Ray fallback, and eligibility compared the batch's total object count against a per-task limit of 50, so the whole submit was rejected outright and the collection never refreshed. That per-task limit is real capacity rather than an arbitrary cap, since each object carries a model call under a time limit, so raising it would have traded a clean failure for mid-task timeouts. The batch is now chunked to fit instead.
- Aug 27, 2026The transcription_language you set now reaches WhisperBoth multimodal extractors published transcription_language in their public parameter schema with a default of "en", and neither pipeline passed it to Whisper. Setting "ru" on a Russian corpus returned a 200 and transcribed with whatever Whisper guessed from the audio. Nothing errored, because Whisper auto-detects when given no hint, which is why the parameter survived through v1 and v2 looking like it worked. Both legs now forward it. That matters more than it sounds: production runs the API leg and self-hosted tenants run the local one, so wiring either alone would have left the fix inert for real traffic. The local leg had nowhere to put a language at all and gained a config field, passing the hint only when you actually name a language so auto-detect stays the default.