yams/examples/config.toml
Trevon 4e6835a04b
Merge pull request #237 from trvon/docs/install-guide
docs: install and setup guide, Why YAMS, and working repo snippets
2026-09-30 18:00:26 -06:00

860 lines
29 KiB
TOML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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