860 lines
29 KiB
TOML
860 lines
29 KiB
TOML
# YAMS Configuration Template
|
||
# This file contains all available configuration options with their default values.
|
||
# Copy this file to ~/.config/yams/config.toml and modify as needed.
|
||
#
|
||
# File Location Strategy:
|
||
# - All data files (databases, indexes, WAL, objects) are nested under data_dir by default
|
||
# - Paths can be absolute or relative; relative paths are resolved from data_dir
|
||
# - Use ~ for home directory expansion (e.g., ~/.yams/data)
|
||
|
||
[version]
|
||
config_version = 3
|
||
migrated_from = 0
|
||
migration_date = "2025-01-16"
|
||
|
||
[core]
|
||
# Data storage directory - all other data files nest under this by default.
|
||
# ~ is expanded to the home directory. The built-in default is $XDG_DATA_HOME/yams
|
||
# (~/.local/share/yams) on Linux and macOS and %LOCALAPPDATA%\yams on Windows.
|
||
# A value here takes precedence over YAMS_DATA_DIR.
|
||
data_dir = "~/.local/share/yams"
|
||
# Storage engine: "local" or "distributed" (future)
|
||
storage_engine = "local"
|
||
# Enable Write-Ahead Logging for crash recovery
|
||
enable_wal = true
|
||
# Enable telemetry (anonymous usage statistics)
|
||
enable_telemetry = false
|
||
# Log level: "trace", "debug", "info", "warn", "error"
|
||
log_level = "info"
|
||
|
||
[auth]
|
||
# Path to Ed25519 private key for signing
|
||
private_key_path = "~/.config/yams/keys/ed25519.pem"
|
||
# Path to Ed25519 public key for verification
|
||
public_key_path = "~/.config/yams/keys/ed25519.pub"
|
||
# API keys for authentication (optional)
|
||
api_keys = []
|
||
|
||
[performance]
|
||
# Number of worker threads for parallel operations
|
||
num_worker_threads = 4
|
||
# Size of I/O thread pool
|
||
io_thread_pool_size = 2
|
||
# Maximum concurrent operations
|
||
max_concurrent_operations = 100
|
||
# Enable memory-mapped file access
|
||
enable_memory_mapping = false
|
||
# Total cache size in MB
|
||
cache_size_mb = 512
|
||
|
||
[storage]
|
||
# Storage engine type
|
||
engine = "local"
|
||
# Base path for storage (defaults to core.data_dir)
|
||
base_path = "~/.yams/data"
|
||
# Enable transparent compression
|
||
enable_compression = true
|
||
# Enable content deduplication
|
||
enable_deduplication = true
|
||
# Enable content-defined chunking
|
||
enable_chunking = true
|
||
# CAS object storage directories (relative to base_path/data_dir)
|
||
objects_dir = "objects"
|
||
staging_dir = "staging"
|
||
|
||
[storage.s3]
|
||
# S3 Engine Settings (used if storage.engine = "s3")
|
||
url = ""
|
||
region = "us-east-1"
|
||
endpoint = ""
|
||
access_key = ""
|
||
secret_key = ""
|
||
session_token = ""
|
||
use_path_style = false
|
||
# Behavior when S3 is unreachable: "strict" (error) or "local" (fallback to local engine)
|
||
fallback_policy = "strict"
|
||
# Local data dir to use when falling back; empty = config-level data_dir
|
||
fallback_local_data_dir = ""
|
||
|
||
[storage.s3.r2]
|
||
# Explicit Cloudflare R2 temporary-credential bootstrap mode.
|
||
# Keep auth_mode="direct" for normal S3 key/secret usage.
|
||
auth_mode = "direct"
|
||
api_token = ""
|
||
account_id = ""
|
||
parent_access_key_id = ""
|
||
permission = "object-read-write"
|
||
ttl_seconds = 3600
|
||
|
||
[chunking]
|
||
# Rolling hash window size
|
||
window_size = 48
|
||
# Minimum chunk size in bytes
|
||
min_chunk_size = 1024
|
||
# Maximum chunk size in bytes
|
||
max_chunk_size = 16384
|
||
# Target average chunk size
|
||
average_chunk_size = 8192
|
||
# Hash algorithm for chunk identification
|
||
hash_algorithm = "sha256"
|
||
|
||
[compression]
|
||
# Enable compression for new content
|
||
enable = true
|
||
# Compression algorithm. Zstandard is the only compressor.
|
||
algorithm = "zstd"
|
||
# ZSTD compression level (1-22)
|
||
zstd_level = 9
|
||
# Minimum size to consider for compression
|
||
chunk_threshold = 1024
|
||
# Always compress files larger than this
|
||
always_compress_above = 10485760 # 10MB
|
||
# Never compress files smaller than this
|
||
never_compress_below = 1024 # 1KB
|
||
# Compress content older than N days
|
||
compress_after_days = 1
|
||
# Maximum parallel compression operations
|
||
max_concurrent_compressions = 4
|
||
# Use background compression
|
||
async_compression = true
|
||
# Decompression cache entries
|
||
decompression_cache_size = 100
|
||
# Decompression cache size in bytes
|
||
decompression_cache_size_bytes = 536870912 # 512MB
|
||
|
||
[wal]
|
||
# Enable Write-Ahead Logging
|
||
enable = true
|
||
# Directory for WAL files (relative to data_dir if not absolute)
|
||
wal_directory = "wal"
|
||
# Maximum size per log file
|
||
max_log_size = 104857600 # 100MB
|
||
# Sync to disk every N entries
|
||
sync_interval = 1000
|
||
# Maximum time between syncs (ms)
|
||
sync_timeout_ms = 100
|
||
# Compress rotated log files
|
||
compress_old_logs = true
|
||
# Maximum open log files
|
||
max_open_files = 10
|
||
# Batch commits for performance
|
||
enable_group_commit = true
|
||
|
||
[vector_database]
|
||
# Enable vector database for embeddings
|
||
enable = true
|
||
# SQLite database path for vectors (relative to data_dir if not absolute)
|
||
database_path = "vectors.db"
|
||
# Table name for embeddings
|
||
table_name = "document_embeddings"
|
||
# Embedding dimension (new installs default to simeon-default / 1024; existing DBs keep their stored dim)
|
||
embedding_dim = 1024
|
||
# Enable periodic checkpoints
|
||
enable_checkpoints = true
|
||
# Operations between checkpoints
|
||
checkpoint_frequency = 1000
|
||
# Maximum batch size for operations
|
||
max_batch_size = 1000
|
||
# Default similarity threshold for search
|
||
default_similarity_threshold = 0.35
|
||
# Use in-memory database (for testing)
|
||
use_in_memory = false
|
||
# Auto-create database if missing
|
||
auto_create = true
|
||
# Auto-repair on corruption
|
||
auto_repair = true
|
||
# Maximum number of vectors in index (for large corpuses, increase this)
|
||
# Default: 100000. For very large repositories, use 500000 or 1000000
|
||
max_elements = 100000
|
||
|
||
[embeddings]
|
||
# Enable embedding generation
|
||
enable = true
|
||
# Embedding backend: "daemon" or "simeon" (default, in-process, model-free)
|
||
# Env override: YAMS_EMBED_BACKEND
|
||
backend = "simeon"
|
||
# Automatically generate for new documents
|
||
auto_generate = false
|
||
# Automatically trigger embeddings after AddDocument
|
||
auto_on_add = false
|
||
# Preferred embedding model sentinel for the default simeon backend
|
||
preferred_model = "simeon-default"
|
||
# Root directory where optional ONNX plugin models are resolved
|
||
model_path = "~/.yams/models"
|
||
# Path to tokenizer
|
||
tokenizer_path = "models/tokenizer.json"
|
||
# Maximum sequence length
|
||
max_sequence_length = 512
|
||
# Embedding dimension (new installs default to simeon-default / 1024; existing DBs keep their stored dim)
|
||
embedding_dim = 1024
|
||
# Batch size for generation
|
||
batch_size = 32
|
||
# Normalize embedding vectors
|
||
normalize_embeddings = true
|
||
# Use GPU acceleration if available
|
||
enable_gpu = false
|
||
# Number of threads (-1 for auto)
|
||
num_threads = -1
|
||
# Delay between generation batches (ms)
|
||
generation_delay_ms = 1000
|
||
# Track content hash for staleness detection
|
||
track_content_hash = true
|
||
# Model version identifier
|
||
model_version = "1.0.0"
|
||
# Embedding schema version
|
||
embedding_schema_version = 1
|
||
# Keep the optional embedding model resident in memory (ONNX plugin reads this)
|
||
keep_model_hot = true
|
||
# Unload an idle embedding model after this many seconds (0 = never unload)
|
||
model_idle_timeout = 300
|
||
# Preload model on startup
|
||
preload_on_startup = false
|
||
# Maximum memory for model cache (MB)
|
||
max_model_memory_mb = 1024
|
||
|
||
[embeddings.simeon]
|
||
# Simeon encoder presets:
|
||
# - fast: output_dim=384 projection="achlioptas_sparse" lower memory / fastest encode
|
||
# - default: output_dim=1024 projection="fwht" promoted first-class default
|
||
# - quality: output_dim=1024 projection="fwht" pair with [search.simeon_query_router]
|
||
# and [search.simeon_prf] enabled=true once those levers land
|
||
ngram_mode = "char_and_word"
|
||
ngram_min = 3
|
||
ngram_max = 5
|
||
sketch_dim = 4096
|
||
output_dim = 1024
|
||
projection = "fwht"
|
||
l2_normalize = true
|
||
|
||
[embeddings.simeon.bm25]
|
||
enabled = true
|
||
variant = "sab_smooth"
|
||
subword_gamma = 5.0
|
||
max_corpus_docs = 200000
|
||
|
||
[embeddings.simeon.bm25.router]
|
||
# Per-query dispatch between BM25 variants (Atire vs SabSmooth) via
|
||
# simeon::QueryRouter. When enabled, the lexical backend builds both
|
||
# indexes and picks per-query from pre-retrieval features.
|
||
# Preset details: third_party/simeon/docs/router_design.md.
|
||
enabled = true
|
||
preset = "passE_scq0_clar3"
|
||
|
||
[embeddings.selection]
|
||
# Selection strategy: "ranked" (score-based) or "intro_headings" (intro + headings only)
|
||
strategy = "ranked"
|
||
# Chunk selection mode before embedding: "full", "budgeted", or "adaptive"
|
||
mode = "budgeted"
|
||
# Maximum chunks selected per document when mode != "full"
|
||
max_chunks_per_doc = 8
|
||
# Maximum total characters selected per document when mode != "full"
|
||
max_chars_per_doc = 24000
|
||
# Additional score boost for heading-like chunks in adaptive mode
|
||
heading_boost = 1.25
|
||
# Additional score boost for intro/early chunks in adaptive mode
|
||
intro_boost = 0.75
|
||
|
||
# Daemon service and plugins
|
||
[daemon]
|
||
# Enable daemon-managed model provider and plugin auto-loading
|
||
enable = true
|
||
# Auto-start daemon if not running when needed
|
||
auto_start = true
|
||
# Unix domain socket path for IPC. Leave unset to use the per-user default:
|
||
# $XDG_RUNTIME_DIR/yams-daemon.sock, else /tmp/yams-daemon-<uid>.sock.
|
||
# socket_path = "/tmp/yams-daemon.sock"
|
||
# PID file for daemon process management (default: next to the socket's runtime dir)
|
||
# pid_file = "/tmp/yams-daemon.pid"
|
||
# Connection timeout in milliseconds
|
||
connect_timeout_ms = 1000
|
||
# Request timeout in milliseconds
|
||
request_timeout_ms = 5000
|
||
# Auto-load plugins from standard directories (and YAMS_PLUGIN_DIR if set)
|
||
auto_load_plugins = true
|
||
# Optional explicit plugin directory (comment out to use defaults and YAMS_PLUGIN_DIR)
|
||
# plugin_dir = "/usr/local/lib/yams/plugins"
|
||
# Strict plugin root mode: only scan trusted/configured roots, skip built-in defaults.
|
||
# Environment override: YAMS_PLUGIN_DIR_STRICT=1
|
||
plugin_dir_strict = false
|
||
# Enforce plugin naming policy: "relaxed" (accept yams_*_plugin.* or libyams_*_plugin.*)
|
||
# or "spec" (require libyams_*_plugin.*). Environment override: YAMS_PLUGIN_NAME_POLICY.
|
||
plugin_name_policy = "relaxed"
|
||
# Worker threads for daemon (0 = auto)
|
||
worker_threads = 0
|
||
# Max memory in GB the daemon will attempt to use (0 = unlimited)
|
||
max_memory_gb = 0
|
||
# Log level for daemon background service (trace|debug|info|warn|error)
|
||
log_level = "info"
|
||
# Do not rebuild vector schema automatically when embedding dimensions change.
|
||
# Run an explicit foreground vector/embedding repair after choosing the target dimension.
|
||
auto_rebuild_on_dim_mismatch = false
|
||
# Auto-repair missing/corrupted chunks and embeddings in the background
|
||
auto_repair = true
|
||
# Batch size for auto-repair passes
|
||
auto_repair_batch_size = 16
|
||
# Prefer centralized tuning (TuningManager); set to true only if you need legacy in-loop tuner
|
||
# use_legacy_tuner = false
|
||
|
||
[daemon.instrumentation]
|
||
# Runtime instrumentation profile.
|
||
#
|
||
# Profiles:
|
||
# - "normal" / "off" : disable automatic instrumentation behavior.
|
||
# - "memory" / "heap" / "malloc" : reduce concurrent startup maintenance so macOS
|
||
# MallocStackLoggingNoCompact captures the target workload instead of background
|
||
# repair, lexical, and vector-index rebuild noise.
|
||
profile = "normal"
|
||
# Override the profile defaults only when debugging a specific subsystem.
|
||
# suppress_auto_repair = true
|
||
# suppress_simeon_lexical_build = true
|
||
# suppress_vector_index_build = true
|
||
|
||
[daemon.graph_prune]
|
||
# Enable graph prune for snapshot-scoped version nodes
|
||
enabled = false
|
||
# Keep latest N snapshot versions per canonical node
|
||
keep_latest = 3
|
||
# How often to run prune
|
||
interval_minutes = 60
|
||
# Initial delay after startup
|
||
initial_delay_minutes = 10
|
||
|
||
[daemon.maintenance]
|
||
# Idle-only maintenance run by the repair service (no clients connected, no resource pressure).
|
||
# How often vectors.db is checked for a VACUUM that reclaims its free pages (0 disables).
|
||
vector_vacuum_interval_hours = 24
|
||
# Session files (under $XDG_STATE_HOME/yams/sessions) nobody has opened or changed for this
|
||
# many days are deleted, except the current session, sessions watching a directory that still
|
||
# exists, and sessions that still own documents (0 disables).
|
||
session_expiry_days = 30
|
||
|
||
# Host-load awareness. While the machine is busy (Linux PSI "some avg10", else load average
|
||
# per CPU; macOS load average and memory pressure), the daemon defers background work:
|
||
# topology rebuilds, repair scans, snapshot backfill, vectors.db VACUUM and semantic backfill.
|
||
# Integrity checks, crash recovery and WAL checkpoints are never deferred.
|
||
[tuning.resource]
|
||
# host_pressure = true # false ignores host load
|
||
# host_cpu_pressure_pct = 40 # 1..100; raise on shared build hosts
|
||
# host_io_pressure_pct = 30
|
||
# host_memory_pressure_pct = 10
|
||
# host_load_per_cpu = 1.5 # fallback when PSI is unavailable
|
||
# background_max_deferral_s = 300 # longest deferral before work runs anyway; 0 never defers
|
||
|
||
# Centralized tuning knobs (advanced): defaults are safe; uncomment to override
|
||
[tuning]
|
||
# Default tuning preset applied by the daemon. Options: "efficient", "balanced", "aggressive".
|
||
profile = "balanced"
|
||
# Max concurrent in-flight list requests admitted to the daemon
|
||
list_inflight_limit = 8
|
||
# How long list requests wait for admission before erroring (ms)
|
||
list_admission_wait_ms = 200
|
||
# Max concurrent in-flight grep requests
|
||
grep_inflight_limit = 1
|
||
# How long grep requests wait for admission before erroring (ms)
|
||
grep_admission_wait_ms = 20000
|
||
# backpressure_read_pause_ms = 5
|
||
# worker_poll_ms = 150
|
||
# idle_cpu_pct = 10.0
|
||
# idle_mux_low_bytes = 4194304
|
||
# idle_shrink_hold_ms = 5000
|
||
# pool_cooldown_ms = 500
|
||
# pool_scale_step = 1
|
||
# pool_ipc_min = 1
|
||
# pool_ipc_max = 32
|
||
# pool_io_min = 1
|
||
# pool_io_max = 32
|
||
# io_conn_per_thread = 8 # grow IO pool only when activeConn > ioThreads * value
|
||
# post_ingest_threads = 0 # 0 = auto (recommend ~12.5% CPU budget, hard max 4)
|
||
# post_ingest_queue_max = 1000 # bounded queue; producers block when full (backpressure)
|
||
# use_internal_bus_for_repair = false # when true, queue repair embed jobs to internal bus
|
||
# use_internal_bus_for_post_ingest = false # when true, queue post-ingest tasks to internal bus
|
||
# stream_mux_very_high_bytes = 268435456 # 256 MiB
|
||
# stream_mux_high_bytes = 134217728 # 128 MiB
|
||
# stream_mux_light1_bytes = 8388608 # 8 MiB
|
||
# stream_mux_light2_bytes = 33554432 # 32 MiB
|
||
# stream_mux_light3_bytes = 67108864 # 64 MiB
|
||
|
||
# Post-ingest pipeline concurrency caps. Omit a key to let the daemon auto-tune from the CPU
|
||
# budget (see TuneAdvisor::postIngestBudgetedConcurrency). Env vars (YAMS_POST_*_CONCURRENT)
|
||
# take precedence over these config keys. Valid ranges match the setter clamps:
|
||
# total_concurrent: 1..256 ; embed_concurrent: 1..32
|
||
# extraction_concurrent, kg_concurrent: 1..64 ; entity_concurrent, title_concurrent: 1..16
|
||
[tuning.post_ingest]
|
||
# total_concurrent = 8
|
||
# embed_concurrent = 4
|
||
# extraction_concurrent = 3
|
||
# kg_concurrent = 6
|
||
# entity_concurrent = 2
|
||
# title_concurrent = 2
|
||
|
||
# Notes:
|
||
# - When [embeddings].enable = false, the daemon automatically disables the model provider
|
||
# and plugin auto-load to reduce startup overhead.
|
||
# - You can override plugin discovery with environment variables:
|
||
# * YAMS_PLUGIN_DIR: an exclusive directory to scan for plugins
|
||
# * YAMS_PLUGIN_DIR_STRICT: when truthy, skip built-in default plugin roots
|
||
# - Trust list persistence file is <data_dir>/plugins.trust
|
||
# - To control client/daemon timeouts at runtime, you can set:
|
||
# * YAMS_REQUEST_TIMEOUT_MS (sets both header/body timeouts in client)
|
||
# * YAMS_HEADER_TIMEOUT_MS / YAMS_BODY_TIMEOUT_MS (client-specific)
|
||
|
||
[embeddings.cache]
|
||
# Enable embedding cache for queries
|
||
enable_query_cache = true
|
||
# Cache size (number of queries)
|
||
cache_size = 1000
|
||
# Cache TTL in seconds
|
||
cache_ttl_seconds = 3600
|
||
# Use LRU eviction
|
||
lru_eviction = true
|
||
|
||
|
||
[vector_index]
|
||
# Index type: "FLAT", "HNSW", "IVF_FLAT", "IVF_PQ", "LSH", "ANNOY"
|
||
type = "HNSW"
|
||
# Vector dimension
|
||
dimension = 384
|
||
# Distance metric: "COSINE", "L2", "INNER_PRODUCT"
|
||
distance_metric = "COSINE"
|
||
# HNSW: connections per node
|
||
hnsw_m = 16
|
||
# HNSW: construction accuracy
|
||
hnsw_ef_construction = 200
|
||
# HNSW: search accuracy
|
||
hnsw_ef_search = 50
|
||
# Normalize vectors before indexing
|
||
normalize_vectors = true
|
||
# Maximum number of vectors
|
||
max_elements = 1000000
|
||
# Save/load index from disk
|
||
enable_persistence = true
|
||
# Index file path
|
||
index_path = "vector_index.bin"
|
||
# Batch size for operations
|
||
batch_size = 1000
|
||
# Use SIMD instructions
|
||
use_simd = true
|
||
# Number of threads (0 for auto)
|
||
num_threads = 0
|
||
# Use delta index for updates
|
||
enable_delta_index = true
|
||
# Merge delta when it reaches this size
|
||
delta_threshold = 1000
|
||
|
||
[search]
|
||
# Default result limit
|
||
default_limit = 10
|
||
# Maximum allowed limit
|
||
max_limit = 100
|
||
# Enable search result caching
|
||
enable_cache = true
|
||
# Cache size (number of queries)
|
||
cache_size = 1000
|
||
# Cache TTL in minutes
|
||
cache_ttl_minutes = 60
|
||
# Reranker backend: "simeon" (default), "onnx", "colbert", or "auto"
|
||
reranker_backend = "simeon"
|
||
# Preferred reranker model (optional)
|
||
reranker_model = ""
|
||
|
||
[search.path_tree]
|
||
# Enable path-tree traversal to serve hierarchical workloads (prefix/semantic/diff)
|
||
enable = false
|
||
# Mode when enabled: "fallback" keeps baseline scans as a safety net, "preferred" makes the tree the default
|
||
mode = "fallback"
|
||
|
||
[search.hybrid]
|
||
# Enable hybrid search
|
||
enable = true
|
||
# Enable knowledge graph scoring
|
||
enable_kg = true
|
||
# Weight for vector similarity
|
||
vector_weight = 0.50
|
||
# Weight for keyword relevance
|
||
keyword_weight = 0.30
|
||
# Weight for KG entity similarity
|
||
kg_entity_weight = 0.10
|
||
# Weight for structural prior
|
||
structural_weight = 0.05
|
||
# Weight for BART classification similarity (when enhanced search enabled)
|
||
classification_weight = 0.05
|
||
# Number of vector results to retrieve
|
||
vector_top_k = 50
|
||
# Number of keyword results to retrieve
|
||
keyword_top_k = 50
|
||
# Final number of results
|
||
final_top_k = 10
|
||
# Fusion strategy: "LINEAR_COMBINATION", "RECIPROCAL_RANK", "CASCADE"
|
||
fusion_strategy = "LINEAR_COMBINATION"
|
||
# RRF constant (for RECIPROCAL_RANK)
|
||
rrf_k = 60.0
|
||
# Enable post-fusion rerank-style score replacement
|
||
enable_reranking = true
|
||
# Number of top fused results eligible for rerank-style passes
|
||
rerank_top_k = 20
|
||
# Enable query expansion
|
||
enable_query_expansion = false
|
||
# Number of expansion terms
|
||
expansion_terms = 5
|
||
# Weight for expansion terms
|
||
expansion_weight = 0.3
|
||
# Maximum KG neighbors to consider
|
||
kg_max_neighbors = 32
|
||
# Maximum KG hops
|
||
kg_max_hops = 1
|
||
# Time budget for KG scoring (ms)
|
||
kg_budget_ms = 20
|
||
# Normalize scores to [0,1]
|
||
normalize_scores = true
|
||
# Generate search explanations
|
||
generate_explanations = true
|
||
# Include debug scores
|
||
include_debug_scores = false
|
||
# Run searches in parallel
|
||
parallel_search = true
|
||
|
||
[search.topology]
|
||
# Product-default topology context around hybrid retrieval. Use "disabled" only as a scientific
|
||
# control or explicit operator override.
|
||
mode = "hybrid_assist"
|
||
# Observe the routed projection while preserving the global ANN result set.
|
||
vector_policy = "shadow"
|
||
# Minimum selected-cluster prefix when adaptive routing is enabled
|
||
min_clusters = 1
|
||
# Max number of clusters considered when routing a weak query
|
||
max_clusters = 2
|
||
# Cap ranked lexical documents used as sparse routing evidence
|
||
max_seed_documents = 32
|
||
# Maximum dense representatives evaluated per cluster (0 = all stored representatives)
|
||
representative_limit = 0
|
||
# Grow the selected prefix while route scores remain this close to the best (0 = fixed max_clusters)
|
||
adaptive_probe_score_gap = 0.0
|
||
# Abstain from narrowing when the selected/excluded score boundary is smaller (0 = disabled)
|
||
narrow_min_boundary_margin = 0.20
|
||
# Max number of candidate docs pulled from routed clusters
|
||
max_docs = 64
|
||
# Score boost applied to medoid documents in routed clusters
|
||
medoid_boost = 0.05
|
||
# Maximum additive topology evidence applied during fusion
|
||
evidence_weight = 0.02
|
||
# Sparse/dense route score blend (0 = sparse only, 1 = dense only)
|
||
sparse_dense_alpha = 0.5
|
||
# Reject routes below this score
|
||
min_route_score = 0.0
|
||
# RRF k used by hybrid fusion
|
||
rrf_k = 12.0
|
||
# Cluster-route scoring rule for SparseGuidedClusterRouter.
|
||
# "current" — persistence + 0.5*cohesion + matchedSeed + memberCount/40 (default)
|
||
# "size_weighted" — current * 1/(1+log(size)); de-emphasizes giant clusters
|
||
# "seed_coverage" — rank by fraction of query seeds covered by each cluster
|
||
route_scoring = "current"
|
||
|
||
[topology]
|
||
# Cluster-formation engine used by the background topology rebuild.
|
||
# "connected" — reciprocal-edge connected components (default, baseline)
|
||
# "louvain" — modularity-greedy communities on the reciprocal-edge graph
|
||
# "kmeans" — embedding-space coarse quantizer
|
||
engine = "connected"
|
||
|
||
[topology.tuner]
|
||
# Phase G: per-corpus adaptive topology tuner (UCB1 multi-armed bandit over
|
||
# supported engines). Each successful rebuild produces an
|
||
# intrinsic-quality reward (singletonRatio, giantClusterRatio, gini, intraEdge);
|
||
# the bandit learns which arm fits the corpus shape best. No relevance labels
|
||
# required. Off by default.
|
||
#
|
||
# Tuning recipes — uncomment one block to activate, leaving the others as
|
||
# documentation. Enabling the tuner overrides the static engine above whenever
|
||
# an arm is pulled.
|
||
#
|
||
# off (default): static [topology] knobs win; bandit dormant.
|
||
enabled = false
|
||
#
|
||
# default: 10-min cooldown, 100-doc delta, plan-G reward weights.
|
||
# Best fit for steady-state corpora that grow modestly between rebuilds.
|
||
# enabled = true
|
||
# cooldown_minutes = 10
|
||
# doc_count_delta = 100
|
||
#
|
||
# aggressive: 30-min cooldown, 500-doc delta, lower singleton penalty.
|
||
# Best fit for fast-growing corpora where rebuilds are expensive (50k+ docs).
|
||
# enabled = true
|
||
# cooldown_minutes = 30
|
||
# doc_count_delta = 500
|
||
|
||
[topology.tuner.reward]
|
||
# Intrinsic-reward weights. Reward = clamp(1 - α·singleton - β·giant -
|
||
# γ·|gini-0.4| + δ·intraEdge, 0, 1). Defaults reflect the Phase G plan.
|
||
# Lowering alpha/beta accepts noisier clusterings; raising delta favors
|
||
# tighter intra-cluster cohesion at the cost of global structure.
|
||
alpha_singleton = 0.4
|
||
beta_giant_cluster = 0.4
|
||
gamma_gini_deviation = 0.1
|
||
delta_intra_edge = 0.1
|
||
|
||
[knowledge_graph]
|
||
# Database path for KG (relative to data_dir if not absolute)
|
||
# Defaults to {data_dir}/yams.db
|
||
db_path = "yams.db"
|
||
# Enable full-text search for aliases
|
||
enable_alias_fts = true
|
||
# Enable WAL mode
|
||
enable_wal = true
|
||
# Prefer exact alias matches
|
||
prefer_exact_alias_first = true
|
||
# Default query limit
|
||
default_limit = 1000
|
||
# Node cache capacity
|
||
node_cache_capacity = 10000
|
||
# Alias cache capacity
|
||
alias_cache_capacity = 50000
|
||
# Embedding cache capacity
|
||
embedding_cache_capacity = 10000
|
||
# Neighbor cache capacity
|
||
neighbor_cache_capacity = 10000
|
||
|
||
# External knowledge graph endpoints for taxonomy/ontology retrieval
|
||
endpoints = ["http://localhost:7200/repositories/yams"]
|
||
# Default taxonomy domains for classification
|
||
default_domains = ["computer_science", "business", "research"]
|
||
# Cache taxonomy for N minutes
|
||
taxonomy_cache_minutes = 60
|
||
# Maximum related concepts to fetch per query
|
||
max_related_concepts = 20
|
||
# Maximum concept relationship depth to explore
|
||
max_concept_depth = 2
|
||
# HTTP timeout for KG requests (milliseconds)
|
||
request_timeout_ms = 3000
|
||
# Enable automatic domain detection from document content
|
||
enable_domain_detection = true
|
||
# SPARQL endpoint authentication (if required)
|
||
auth_username = ""
|
||
auth_password = ""
|
||
# Enable concept relationship caching
|
||
enable_relationship_cache = true
|
||
# Relationship cache TTL (minutes)
|
||
relationship_cache_ttl_minutes = 120
|
||
|
||
[file_detection]
|
||
# Use libmagic if available
|
||
use_lib_magic = true
|
||
# Use built-in patterns
|
||
use_builtin_patterns = true
|
||
# Use custom patterns
|
||
use_custom_patterns = true
|
||
# Path to custom patterns file
|
||
patterns_file = ""
|
||
# Maximum bytes to read for detection
|
||
max_bytes_to_read = 512
|
||
# Cache detection results
|
||
cache_results = true
|
||
# Cache size
|
||
cache_size = 1000
|
||
|
||
[mcp_server]
|
||
# Enable MCP server
|
||
enable = false
|
||
# Transport: "stdio", "websocket"
|
||
transport = "stdio"
|
||
# WebSocket host
|
||
host = "localhost"
|
||
# WebSocket port
|
||
port = 8080
|
||
# WebSocket path
|
||
path = "/mcp"
|
||
# Use SSL/TLS
|
||
use_ssl = false
|
||
# Connection timeout (ms)
|
||
connect_timeout_ms = 5000
|
||
# Receive timeout (ms)
|
||
receive_timeout_ms = 30000
|
||
# Maximum message size
|
||
max_message_size = 1048576 # 1MB
|
||
# Enable WebSocket ping/pong
|
||
enable_ping_pong = true
|
||
# Ping interval (seconds)
|
||
ping_interval_s = 30
|
||
|
||
# Optional: directory for file-backed prompt templates (Markdown).
|
||
# Files named PROMPT-*.md will be exposed via `prompts/list` and `prompts/get`.
|
||
# Examples: PROMPT-search-codebase.md -> name: "search_codebase"
|
||
# If not set, defaults to XDG_DATA_HOME/yams/prompts or ~/.local/share/yams/prompts,
|
||
# and as a last resort uses ./docs/prompts when running from the repo root.
|
||
# prompts_dir = "/home/user/.local/share/yams/prompts"
|
||
|
||
[daemon.models]
|
||
# Maximum number of models to keep loaded in memory
|
||
max_loaded_models = 4
|
||
# Number of models to keep always loaded (hot pool)
|
||
hot_pool_size = 2
|
||
# Models to preload on daemon startup
|
||
preload_models = ["bart-large-mnli"]
|
||
# Load models only when first requested
|
||
lazy_loading = false
|
||
# Unload models after being idle for N seconds
|
||
model_idle_timeout_s = 300
|
||
# Enable GPU acceleration if available
|
||
enable_gpu = false
|
||
# Number of threads for ONNX inference
|
||
num_threads = 4
|
||
# Model eviction policy: "lru" (least recently used), "lfu", "fifo"
|
||
eviction_policy = "lru"
|
||
|
||
[daemon.resource_pool]
|
||
# Minimum ONNX sessions per model
|
||
min_sessions = 1
|
||
# Maximum ONNX sessions per model
|
||
max_sessions = 3
|
||
# Session idle timeout in seconds
|
||
idle_timeout_s = 300
|
||
# Validate session health before use
|
||
validate_on_acquire = true
|
||
|
||
[classification]
|
||
# Enable BART-based document classification for intelligent tagging
|
||
enable = false
|
||
# Path to BART-MNLI model
|
||
model_path = "~/.yams/models/bart-large-mnli"
|
||
# Confidence threshold for tag assignment
|
||
confidence_threshold = 0.7
|
||
# Maximum tags per document
|
||
max_tags_per_document = 5
|
||
# Maximum sequence length for classification
|
||
max_sequence_length = 1024
|
||
# Enable batch processing for efficiency
|
||
enable_batch_processing = true
|
||
# Batch size for classification
|
||
batch_size = 16
|
||
# Model inference timeout (milliseconds)
|
||
inference_timeout_ms = 5000
|
||
# Automatically classify documents during indexing
|
||
auto_classify_on_index = true
|
||
# Enable real-time classification during search
|
||
enable_search_time_classification = false
|
||
|
||
[search.hotzones]
|
||
# Enable hotzone-based result boosting
|
||
enable = false
|
||
# Decay factor for hotzone relevance over time (0.0-1.0)
|
||
decay_factor = 0.95
|
||
# Minimum access frequency to maintain hotzone
|
||
min_frequency = 3
|
||
# Hotzone decay interval (hours)
|
||
decay_interval_hours = 24
|
||
# Maximum boost factor for hot concepts
|
||
max_boost_factor = 2.0
|
||
# Enable persistence of hotzone data across restarts
|
||
enable_persistence = true
|
||
# Hotzone data file path (relative to data_dir if not absolute)
|
||
data_file = "hotzones.db"
|
||
# Background decay processing interval (minutes)
|
||
decay_processing_interval_minutes = 60
|
||
# Enable cross-user hotzone sharing
|
||
enable_shared_hotzones = false
|
||
|
||
[search.enhanced]
|
||
# Enable enhanced search pipeline with classification and KG
|
||
enable = false
|
||
# Weight for BART classification scoring in final results
|
||
classification_weight = 0.15
|
||
# Weight for knowledge graph expansion in final results
|
||
kg_expansion_weight = 0.10
|
||
# Weight for hotzone boosting in final results
|
||
hotzone_weight = 0.05
|
||
# Enable cross-domain concept discovery
|
||
enable_cross_domain = true
|
||
# Maximum concepts for expansion per search result
|
||
max_expansion_concepts = 10
|
||
# Enable search result re-ranking based on concept similarity
|
||
enable_concept_reranking = true
|
||
# Timeout for enhanced search pipeline (milliseconds)
|
||
enhanced_search_timeout_ms = 2000
|
||
|
||
[migrations]
|
||
# Automatically migrate on version change
|
||
auto_migrate = true
|
||
# Create backup before migration
|
||
backup_before_migrate = true
|
||
# Migration log file path
|
||
migration_log_path = "migrations.log"
|
||
|
||
[indexing]
|
||
# PBI-040: Synchronous FTS5 indexing threshold
|
||
# When adding <= sync_threshold documents, perform FTS5 indexing synchronously
|
||
# instead of queueing to PostIngestQueue. This eliminates the 5-10s async delay
|
||
# for grep on small batches, making results immediately available.
|
||
# Set to 0 to always use async indexing (original behavior).
|
||
# Default: 10 files
|
||
sync_threshold = 10
|
||
|
||
[downloader]
|
||
# Default concurrency for parallel connections
|
||
default_concurrency = 4
|
||
# Default chunk size in bytes
|
||
default_chunk_size_bytes = 8388608
|
||
# Per-connection timeout in ms
|
||
default_timeout_ms = 60000
|
||
# Follow HTTP redirects
|
||
follow_redirects = true
|
||
# Enable resume using HTTP Range/If-Range
|
||
resume = true
|
||
# Global rate limit (bytes/sec, 0 = unlimited)
|
||
rate_limit_global_bps = 0
|
||
# Per-connection rate limit (bytes/sec, 0 = unlimited)
|
||
rate_limit_per_conn_bps = 0
|
||
# Retry/backoff policy
|
||
max_retry_attempts = 5
|
||
retry_backoff_ms = 500
|
||
retry_backoff_multiplier = 2.0
|
||
retry_max_backoff_ms = 15000
|
||
# Default checksum algorithm when provided
|
||
checksum_algo = "sha256"
|
||
# Temporary file extension for staging
|
||
temp_extension = ".part"
|
||
# Store directly into CAS by default; no user path writes unless export requested
|
||
store_only = true
|
||
# Maximum allowed file size in bytes (0 = unlimited)
|
||
max_file_bytes = 0
|
||
|
||
[downloader.tls]
|
||
# Verify TLS certificates (recommended)
|
||
verify = true
|
||
# Path to CA bundle (empty = system default)
|
||
ca_path = ""
|
||
|
||
[downloader.proxy]
|
||
# Proxy URL (e.g., http://user:pass@host:port) or empty
|
||
url = ""
|
||
|
||
[cli.streaming]
|
||
# Enable streaming for large payloads on CLI <-> daemon IPC
|
||
enable = true
|
||
# Switch to streaming when payload exceeds this many bytes
|
||
payload_threshold_bytes = 262144
|
||
# Switch to streaming when first-byte latency exceeds this many ms
|
||
ttfb_threshold_ms = 150
|
||
# Per-chunk size on the streaming transport
|
||
chunk_size_bytes = 65536
|
||
# Maximum number of in-flight chunks
|
||
max_inflight_chunks = 4
|
||
|
||
[cli.pool]
|
||
# CLI <-> daemon client pool sizing and timeouts
|
||
max_clients = 8
|
||
min_clients = 1
|
||
acquire_timeout_ms = 5000
|
||
# 0 = unbounded waiter queue
|
||
max_waiters = 0
|
||
fair_queue = true
|
||
health_check_interval_ms = 30000
|
||
health_check_timeout_ms = 500
|
||
reconnect_backoff_base_ms = 100
|
||
reconnect_backoff_max_ms = 5000
|
||
reconnect_backoff_jitter_pct = 0.2
|
||
|
||
[repair]
|
||
# Online repair of missing embeddings / corrupted chunks while serving traffic
|
||
enable_online_repair = false
|
||
max_repair_concurrency = 1
|
||
repair_backoff_ms = 250
|
||
max_retries = 3
|