Components¶
Lens fetches the engines and models it needs. After the install line and a model provider set in the web app, there is nothing to install by hand.
Each worker looks after its own machine. It compares what the settings ask for with what's installed, and fetches what's missing in the background, one thing at a time. Engines and models for job steps are fetched on first use: the first time an asset is waiting for the step that needs them. Until then they show as On first use, and an archive that only uses cloud models never downloads them, which keeps a small machine (a Raspberry Pi) small. Documents, images and transcripts imported without their audio (pasted ones too) skip the transcribe and diarize steps, so they never fetch a speech or voice model.
| Component | Fetched when | What |
|---|---|---|
| PyTorch | SenseVoice or voice IDs are used | the CPU build when the machine has no NVIDIA GPU (about 900 MB instead of several GB) |
| SenseVoice | transcribe.engine is sensevoice (the default) |
FunASR and the SenseVoice and voice-activity models |
| Whisper model | transcribe.engine is whisper |
the faster-whisper model named in transcribe.whisper.model |
| Voice IDs | speakers are separated by clustering (the default) | SpeechBrain and its ECAPA voiceprint model |
| Face models | video.face_engine is opencv (the default) |
OpenCV, YuNet and SFace |
| Face models | video.face_engine is anytopdf |
SFace, for anytopdf to describe faces with (anytopdf too) |
| Object model | video.object_engine is yolox (the default) or anytopdf |
YOLOX-s, and ONNX Runtime for yolox |
| NSFW model | NSFW classification is on for the archive or a namespace (off by default) | the 8-bit ONNX export of AdamCodd/vit-base-nsfw-detector (Apache-2.0, 88 MB), and ONNX Runtime |
| Florence-2 | llm.describe_engine is florence-2 |
Florence-2-base-ft or -large-ft (MIT, llm.florence_model; about 280 or 830 MB), their 8-bit ONNX exports, the tokenizers library and ONNX Runtime, to describe pictures on this machine |
| Moondream | llm.describe_engine is moondream, and this machine can run the chosen one |
Moondream 3 Preview (BSL 1.1, about 19 GB, an NVIDIA GPU or a Mac with 32 GB) or Moondream 2 (Apache-2.0, about 3.7 GB), llm.moondream_model, at a pinned revision, with its tokenizer, PyTorch (the CPU build without an NVIDIA GPU) and transformers, to describe pictures on this machine |
| Real-ESRGAN | enhancing images is on and enhance.image_engine is realesrgan (off by default) |
Real-ESRGAN general x4v3 as an ONNX model (BSD-3-Clause, 5 MB), and ONNX Runtime |
| Prompt-injection classifier | ai.injection_check is classifier |
ProtectAI's deberta-v3-base-prompt-injection-v2 (Apache-2.0, about 740 MB), the tokenizers library and ONNX Runtime (third-party content) |
| Kokoro | voice.tts_provider is kokoro, as soon as it's saved (podcast jobs wait for it) |
Kokoro v1.0 (Apache-2.0): the model in voice.kokoro_model (326, 164 or 114 MB) and its 54 voices (28 MB), and the kokoro extra: kokoro-onnx (MIT), ONNX Runtime, and espeak-ng with phonemizer (GPL-3.0, only in this extra), about 95 MB, to read aloud on this machine |
| Punctuation model | analysis.cleanup is on and analysis.cleanup_punctuation isn't off (Cleaning up transcripts) |
kredor/punctuate-all at a pinned revision (MIT, about 1.1 GB), with Transformers and PyTorch's CPU build |
| spaCy | analysis.entities is spacy (Entities) |
spaCy (MIT) and the model in analysis.spacy_model: en_core_web_sm, de_core_news_sm or xx_ent_wiki_sm (MIT, 11 to 15 MB each), about 60 MB in all |
| WebRTC audio processing | a job first reaches a pipeline's clean_audio step (Cleaning up audio) |
pywebrtc-audio (Apache-2.0, about 0.5 MB, numpy only): WebRTC's noise suppression, gain control, echo cancellation and voice detection |
| DuckDuckGo search | web.search is duckduckgo |
ddgs (MIT, about 30 MB with lxml and primp), the client the assistant's web search reads DuckDuckGo's results with |
| yt-dlp | documents.video_urls is on |
the yt-dlp program, release 2026.08.19 (Unlicense), to download videos and podcasts imported by address |
| Chat model, embedding model | the LLM provider or embeddings server is Ollama | pulled on that server (/api/pull) |
| Code sandbox client | the code sandbox is on (sandbox.enabled) |
OpenShell's Python SDK (Apache-2.0) and gRPC, about 10 MB, to reach its gateway |
| Vaultwarden client | a Vaultwarden address is set (secrets.vaultwarden_url) |
python-vaultwarden (Apache-2.0, about 10 MB with its crypto libraries), to read secrets from a Vaultwarden or Bitwarden vault |
| Outlook .msg emails | listed in components.also |
extract-msg (GPL-3.0, so only when asked for) |
- Python packages go into
data_dir/python, at the versions inuv.lock. Packages the image already has win. - Models go into
data_dir/models: the Hugging Face, ModelScope and PyTorch caches point there (unlessHF_HOME,MODELSCOPE_CACHEorTORCH_HOMEsay otherwise). They outlast container rebuilds and upgrades. - Model files fetched by URL (YOLOX, YuNet, SFace, the NSFW model, Florence-2, Kokoro, spaCy's models, Real-ESRGAN) are checked against their SHA-256.
- A job step that needs something still being fetched waits for it instead of falling back or failing. If a fetch fails, the step runs as before (for transcription, falling back to another engine), and the fetch is tried again an hour later, when the settings change, or on Check again now.
Programs are only checked: a running container can't install them. ffmpeg and Tesseract are in every image. Chromium and LibreOffice (web pages, text, emails, Office files) are in the full image, which the compose files build by default. In a microsandbox's full edition they're installed the first time a document or a web page needs one, and the Components list says so.
Settings¶
| Setting | Default | |
|---|---|---|
components.auto |
true |
fetch what's needed without asking; off, the workers only report what's missing |
components.ahead |
false |
fetch everything the settings could need straight away, instead of on first use |
components.also |
[] |
optional components to fetch too, e.g. ["msg"] |
components.hf_token |
none | a Hugging Face token, kept encrypted, for gated models: pyannote's speaker diarization, and GGUF models whose page asks you to accept terms. HF_TOKEN in the environment wins over it |
Settings → Components shows each worker's machine (processors, memory, GPU, free disk), each component and where
every worker is with it, and the transcription engine that suits the machine. GET /api/v1/components returns the
same; POST /api/v1/components/check asks the workers to look again now.
The setup assistant's server_status lists what the workers are still fetching or couldn't fetch.