Skip to content

Configuration

Virgile Thonnier edited this page Aug 29, 2026 · 2 revisions

Configuration

Everything is edited in Settings inside the app and persisted as JSON at:

%APPDATA%\com.virgi.sensetree\settings.json

The file is tolerant in both directions: unknown or missing fields fall back to defaults (an older settings.json keeps working and keeps its old behaviour), and a corrupted file logs a warning and resets to defaults rather than preventing startup.

Sections

Section Purpose
embedding How text becomes vectors.
reasoning The LLM: chat, plans, qualification, classification.
vision Multimodal model: image captions, PDF OCR.
transcription Speech-to-text for audio/video.
video Visual description of videos.
indexing Roots, chunking, scheduling, qualification toggles.
retrieval Hybrid search and reranking.
mcp_servers External agent tools.
prompts The system prompts driving every AI stage.

embedding

Field Type Default Meaning
mode "local" | "openai" "local" local = built-in fastembed/ONNX engine. openai = an OpenAI-compatible /v1/embeddings endpoint.
model string multilingual-e5-small fastembed model id (local) or remote model name.
base_url string http://localhost:11434/v1 Server base URL, openai mode only.
api_key string "" Optional bearer token. Empty = no header sent.
dimensions number 384 Vector size — must match the model. Defines the vector table schema.
use_gpu bool false Try CUDA for the local engine, graceful CPU fallback.

Full model list and behaviour: Embeddings.

reasoning and vision

Two OpenAI-compatible chat endpoints with an identical shape.

Field Type Meaning
base_url string e.g. http://localhost:11434/v1 (Ollama), http://localhost:1234/v1 (LM Studio), or a LAN address.
model string Model name as the server expects it.
api_key string Optional bearer token.
enabled bool Turn the slot on or off.
reasoning_effort auto | none | low | medium | high Thinking budget requested from the model. auto sends nothing at all, leaving the server's own behaviour untouched — which is why it is the default.

Defaults: reasoning llama3.1:8b, enabled; vision moondream, disabled (a multimodal model is often absent, so it is opt-in).

The vision slot's reasoning_effort genuinely applies to captions and OCR. It is worth setting: on a real image, 32.5 s with reasoning vs 6.9 s without.

transcription

Speech-to-text. Disabled by default. Full guide: Media: Audio & Video.

Field Default Meaning
base_url http://localhost:8000/v1 speaches' port (whisper.cpp: :8080). Not Ollama — it has no transcription endpoint.
model Systran/faster-whisper-large-v3 A locally served model id.
api_key "" Optional bearer.
enabled false Opt-in.
endpoint_path /audio/transcriptions For servers deviating from the convention. A missing leading / is added.
language "" ISO-639-1. Empty = auto-detect, and the field is not sent at all.
response_format "" Empty = the server's default. text, json, verbose_json, srt
extra_fields "" JSON object of extra multipart fields. Invalid JSON is ignored with a warning.
max_file_mb 0 0 = unlimited. Uploads are streamed, so size is not bounded by memory.
timeout_secs 1800 CPU Whisper is often slower than real time.

video

Visual description of videos, complementary to transcription. Disabled by default.

Field Default Meaning
base_url http://localhost:8000/v1 e.g. vLLM.
model Qwen/Qwen2.5-VL-7B-Instruct Must actually read video.
api_key "" Optional bearer.
enabled false Opt-in.
endpoint_path /chat/completions
delivery base64 base64 (universal, streamed) or file_uri (server reads the file itself — fastest, requires shared filesystem).
max_file_mb 0 0 = unlimited.
timeout_secs 1800

indexing

Field Type Default Meaning
roots string[] [] Folders watched and indexed.
chunk_size number 1000 Target characters per chunk.
overlap number 200 Characters carried over between consecutive chunks.
batch_size number 32 Texts per embedding call (both engines).
max_file_mb number 50 Above this, a file is indexed by context only, not extracted.
max_chunks_per_file number 0 0 = unlimited. A cap makes truncation explicit in the stored extract. Off by default: size says nothing about value.
block_bias number 0–1 0.5 Folder classification tendency, 0 = very recursive, 1 = very block. See Indexing Pipeline.
qualify_documents bool true LLM qualification of documents/text/code.
qualify_images bool true LLM qualification of vision captions.
qualify_media bool true LLM qualification of transcriptions. Separate because a one-hour transcript is costly to qualify.
qualify_context bool true LLM guess for unreadable files.
qualify_effort reasoning effort none Effort for all indexing qualifications. The only setting whose default disables thinking — measured: 24.4 s vs 0.78 s per folder classification, same answer.
pipeline_mode "sequential" | "batch" sequential Stage ordering. See Sequential vs batch.
batch_files number 64 Files per slice in batch mode.

retrieval

Field Type Default Meaning
hybrid bool true Fuse dense (meaning) and BM25 (exact words) via Reciprocal Rank Fusion. Off = dense only.
rerank bool true Cross-encoder reranking of the shortlist. Off = faster, notably less precise.
reranker_model string bge-reranker-v2-m3 Also bge-reranker-base, jina-reranker-v2-base-multilingual. Local fastembed models.

Details: Retrieval & RAG.

mcp_servers

An array of external tool servers exposed to the chat agent. Empty by default. Fields and security notes: MCP Servers.

prompts

Ten overridable system prompts. An empty field means "use the built-in default", so you override only what you want and clear a field to revert. See Prompts for each one's contract.

Eight are editable in Settings → Prompts: folder_classify, folder_describe, file_extract, vision_caption, vision_ocr, video_describe, chat_system, reorganize.

Two more exist in the file and are honoured by the backend, but have no UI field yet — edit settings.json directly to override them: doc_qualify (document qualification) and context_guess (guessing an unreadable file's nature).


What triggers what

Change Consequence
embedding.model or embedding.dimensions Full re-index. Vector dimension updated, vector store cleared, index state reset, all roots re-scanned. Vectors from different models are not comparable.
indexing.block_bias or prompts.folder_classify Folder classifications forgotten and re-derived on the next scan. Save, then Re-index.
Adding a root Only the new root is scanned.
Anything else (reasoning, vision, media, prompts, retrieval, MCP, API keys) Effective immediately for new calls. No re-index.

That last row is deliberate: earlier versions re-scanned everything on any Settings save, which made changing an API key a multi-hour affair.

Providers cheat-sheet

Runner Typical base_url Notes
Ollama http://localhost:11434/v1 ollama pull <name>, or the in-app catalog. Gets the native fast paths (bounded embedding context, VRAM unload, /api/ps).
LM Studio http://localhost:1234/v1 Enable its local server. Installs go through the lms CLI.
vLLM / LocalAI / llama.cpp your port + /v1 Full OpenAI compatibility; the usual choice for transcription and video.
Home server / LAN http://192.168.x.y:11434/v1 Any OpenAI-compatible server on your network.
External API provider URL Set api_key. This is the one way file content leaves your machine.

Per-hardware model picks: Models & Providers. Exact request formats: AI Server Protocol.

Clone this wiki locally