Data Infrastructure for Enterprise Agents

Turn multimodal business data into searchable records with source references.

Process files, images, audio, and video with native types, SQL, and Python UDFs. Preserve business IDs and source references, then write text and embeddings to your retrieval and analytics systems.

messy materials→searchable records
native file types · SQL + Python · vector and analytics sinks

messy materials

contract.pdfPDF
inspection photoimage
video framevideo
call audioaudio
spreadsheettable
system loglog
Vane

outputs

Agent-ready outputscontext attached
Context attached
recordstext and model outputs
referencesbusiness ID · URI · timestamps
embeddingsfor retrieval and analytics
The Problem

Keep source context throughout model processing.

Today that chain is stitched across OCR scripts, temp files, model calls, SQL jobs, and review tools.

BEFORE — a fragmented chain

Messy Materials↓
OCR scripts↓
Temp files↓
LLM calls↓
More scripts↓
SQL rules↓
Manual review

⚠ scattered systems · glue code everywhere · lost source references · hard to debug · poor reproducibility

AFTER — one pipeline

Messy Materials↓VANE↓Searchable Recordstext · source references · embeddings
messy materials→searchable records
How Vane Works

From source files to searchable records — in one data pipeline.

STEP 01

Process native file types with SQL and UDFs

native filesmedia operatorsPython UDFs
relation pipeline

Start with FILE, IMAGEFILE, AUDIOFILE, or VIDEOFILE references. Combine media operators, SQL, and Python UDFs; parsing, OCR, and transcription use the libraries and models you configure.

STEP 02

Make source references part of the output

model output
source-linked recordbusiness ID · source URI · timestamps

Select business IDs, source URIs, and segment timestamps alongside text and embeddings. Keep model classifications separate from review status so downstream users can check the source.

STEP 03

Write to your retrieval and analytics systems

text + embeddingssource references
Milvus · Qdrant · Doris

Use distributed upsert sinks for Milvus and Qdrant, or Arrow Stream Load writes to Doris. Configure the destination schema, credentials, and embedding dimensions for your system.

Real Example

Support recordings → searchable feedback in Doris

Adapted from the tutorial, this SQL constructs FILE and AUDIOFILE references, calls the tutorial’s transcription UDF, and embeds timestamped segments. The full tutorial supplies Python UDF registration, model setup, candidate classification, and DorisStreamLoadSink ingestion.

Support recordings
ticket_idformatsource_uri
T1024WAVT1024.wav
T1025WAVT1025.wav
T1026WAVT1026.wav
Vane · one pipeline
1FILE → AUDIOFILE
2transcription UDF
3text → embeddings
Outputs
segment text
source URI + timestamps
384-d embeddings
audio_segments.sql
-- Adapted excerpt: the tutorial registers transcribe_audio in prepare.py.
WITH recordings AS (
    SELECT regexp_extract(f.url, '([^/]+)[.]wav$', 1) AS ticket_id,
           audio_file(file(f.url, NULL, NULL, NULL, NULL)) AS audio
    FROM list_files('./recordings/*.wav') AS f
), transcripts AS (
    SELECT ticket_id, audio.url AS source_uri,
           transcribe_audio(audio) AS segments_json
    FROM recordings
), segments AS (
    SELECT ticket_id, source_uri,
           unnest(from_json(segments_json,
               '[{"segment_id":"INTEGER","text":"VARCHAR","start_ms":"BIGINT","end_ms":"BIGINT"}]'
           )) AS segment
    FROM transcripts
)
SELECT ticket_id, segment.segment_id AS segment_id,
       segment.text AS text, source_uri,
       segment.start_ms AS start_ms, segment.end_ms AS end_ms,
       ai_embed(
           segment.text, provider := 'transformers',
           model := 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2',
           dimensions := 384, on_error := 'raise',
           options := struct_pack(normalize := true, actor_number := 1, batch_size := 16)
       ) AS embedding
FROM segments
WHERE length(trim(segment.text)) > 0;

Ready to prepare multimodal business data for retrieval and analysis?