# everos default configuration. # # Lookup order (later overrides earlier): # 1. This file (shipped defaults; lowest priority) # 2. /everos.toml — user config (optional; root resolved by # resolve_root(): EVEROS_ROOT env > ~/.everos) # 3. Environment variables — EVEROS_
__ # e.g. EVEROS_SQLITE__BUSY_TIMEOUT_MS=10000 # 4. Programmatic init args (highest priority) # # `null` (omitted in TOML) means "use the Pydantic default declared in code". [memory] # Effective timezone for date buckets and timestamps. Drives # core.utils.datetime; this is the SOLE source — OS `TZ` is not # read. Override via `EVEROS_MEMORY__TIMEZONE` env var if needed. timezone = "UTC" [api] # HTTP server bind for ``everos server start``. Default ``127.0.0.1`` # keeps the API on loopback only — EverOS ships no built-in auth (see # SECURITY.md threat model). Only set ``host = "0.0.0.0"`` after you # have placed your own gateway / auth layer in front of the server. # Override via EVEROS_API__HOST and EVEROS_API__PORT. host = "127.0.0.1" port = 8000 [sqlite] # PRAGMA journal_mode — WAL is the recommended high-concurrency mode. journal_mode = "WAL" # PRAGMA synchronous — NORMAL is safe under WAL and ~2x faster than FULL. synchronous = "NORMAL" # PRAGMA foreign_keys — must be explicitly enabled per connection. foreign_keys = true # PRAGMA temp_store — MEMORY keeps query intermediates in RAM (no IO impact # on durability — only affects sort/group/temp-table calculation buffers). temp_store = "MEMORY" # PRAGMA busy_timeout — milliseconds to wait on a locked DB before erroring. busy_timeout_ms = 5000 # PRAGMA journal_size_limit — cap WAL/journal at ~64 MB. journal_size_limit_bytes = 67108864 # PRAGMA cache_size — KB of page cache (per connection). cache_size_kb = 2048 [lancedb] # Read consistency interval in seconds. # omitted / null -> no consistency check (fastest reads) # 0 -> strict (every read checks updates) # >0 -> eventual (interval seconds between checks) # Uncomment to override: # read_consistency_seconds = 5.0 # Rows (with a non-null vector) before a table's vector columns get an # IVF_FLAT index. Below it every vector query scans the whole column. # vector_index_min_rows = 2000 # Search queries one process runs on LanceDB at once; the rest wait. # max_concurrent_queries = 32 [index] # Rebuildable vector/BM25 index. Markdown remains the source of truth. backend = "lancedb" [milvus] # Remote Milvus Server or Zilliz Cloud only; Milvus Lite paths are unsupported. uri = "" token = "" db_name = "" consistency_level = "Session" collection_prefix = "everos" [llm] # Provider-agnostic OpenAI-protocol client config. Override via env: # EVEROS_LLM__MODEL, EVEROS_LLM__API_KEY, EVEROS_LLM__BASE_URL # Or set the field directly in this file (/everos.toml). model = "openai/gpt-4.1-mini" api_key = "" base_url = "https://openrouter.ai/api/v1" # How the reply format is requested: "json_schema" (strict schema, default), # "json_object" (JSON mode) or "prompt_only" (prompt alone). Not every endpoint # accepts a strict schema -- on OpenRouter, sending one can reroute the request. # response_format_mode = "json_schema" # Extra attempts of the identical request after a reply that fails validation. # invalid_reply_retries = 1 # Deadline of one request in seconds. Raise it for slow self-hosted endpoints; # one extraction call may take up to (invalid_reply_retries + 1) x this. # timeout_seconds = 60.0 # LLM for the multi-round retrieval decider. Separate from [llm] because the jobs # differ: [llm] extracts memories during ingestion, this one decides -- inside the search # request, round by round -- which episodes are core and what to query next. An empty # model falls back to [llm], which is how every store built before this section existed # was scored. api_key / base_url are also inherited from [llm] when left blank, so # pointing the decider at another hosted model needs only `model`; set base_url to run it # on a local vLLM / SGLang endpoint instead. [decider] # LLM for the multi-round retrieval decider, when it differs from [llm]. Left # empty the decider runs [llm]'s model, which is what a single-model deployment # wants. Override via env: EVEROS_DECIDER__MODEL / __API_KEY / __BASE_URL / # __TIMEOUT_SECONDS / __EXTRA. # # ⚠ model and base_url must move together. Renaming the model while leaving the # endpoint pointed at a server that does not host it returns 404 on every call, # and the retrieval loop does NOT fail on that -- it falls back to a fixed # top-ranked core and reports a complete result. See the fallback note in # everos.memory.search.llm_multiround. model = "" api_key = "" base_url = "" # See [llm]. response_format_mode follows the model: with `model` empty it is # inherited from [llm] along with it. # response_format_mode = "json_schema" # invalid_reply_retries = 1 # Multi-round loop tuning. Every one of these is a real field, so `everos config` # prints it and a TOML can set it; the legacy EVEROS_LLMMR_* env names still take # precedence when exported, so launch scripts keep working unchanged. max_rounds = 3 # rounds before the loop stops regardless seed_topk = 50 # candidates the original question contributes subq_topk = 20 # candidates each follow-up sub-query contributes max_subqueries = 3 # follow-ups the decider may ask for per round rrf_k = 60 # RRF smoothing when fusing sparse + dense no_new_core_patience = 1 # stop after this many rounds add no new core per_subquery_guarantee = 1 # slots reserved per sub-query in the final fill retries = 3 # decider retries before falling back retry_backoff_seconds = 0.5 # doubled per attempt core_overflow = false # true = let core exceed top_k (pre-2026-08-06) full_text = false # true = decider reads full episode text, not summary fallback_core = 3 # core size when every decider attempt fails [multimodal] # Independent LLM for multimodal parsing (everalgo-parser); must accept # image / pdf / audio image_url parts. Override via env: # EVEROS_MULTIMODAL__MODEL, EVEROS_MULTIMODAL__API_KEY, EVEROS_MULTIMODAL__BASE_URL model = "google/gemini-3.8-flash" api_key = "" base_url = "https://openrouter.ai/api/v1" max_concurrency = 4 # See [llm]. # response_format_mode = "json_schema" # invalid_reply_retries = 1 # file:// content-item support (read locally by EverOS, not everalgo). # file_uri_allow_dirs: empty = allow any readable file (local-first default); # list base dirs to confine reads when the API is exposed. # file_uri_allow_dirs = ["/srv/uploads"] # file_uri_max_bytes = 52428800 # 50 MiB cap per file:// asset [embedding] # OpenAI-compatible embedding endpoint. Override via env: # EVEROS_EMBEDDING__MODEL, EVEROS_EMBEDDING__API_KEY, EVEROS_EMBEDDING__BASE_URL # model and base_url ship with recommended defaults; api_key must be set. model = "Qwen/Qwen3-Embedding-4B" api_key = "" base_url = "https://api.deepinfra.com/v1/openai" # Width of the vector column in every index table. The model must return at # least this many dimensions; a longer vector is truncated (only lossless for # Matryoshka models), a shorter one is refused at startup. Changing it means # every stored vector is invalid: run `everos cascade rebuild`. dim = 1024 timeout_seconds = 30.0 max_retries = 3 batch_size = 10 max_concurrent = 10 # Reserved budget for interactive query embeds, so a search is not queued # behind the cascade's background writes (issue #473). Searches per second # the endpoint can serve is about this value / per-call latency. query_max_concurrent = 16 [rerank] # Rerank provider. Override via env: # EVEROS_RERANK__PROVIDER, EVEROS_RERANK__MODEL, EVEROS_RERANK__API_KEY, # EVEROS_RERANK__BASE_URL # `provider` picks the request-shape: # - "deepinfra" -> POST {base_url}/{model} (DeepInfra inference API) # - "vllm" -> POST {base_url}/rerank (OpenAI-compat rerank endpoint) provider = "deepinfra" model = "Qwen/Qwen3-Reranker-4B" api_key = "" base_url = "https://api.deepinfra.com/v1/inference" timeout_seconds = 30.0 max_retries = 3 batch_size = 10 max_concurrent = 5 [boundary_detection] # Passed through to ``everalgo.boundary.adetect_boundaries``: leading cells # are cut without the model until the rest fits under both limits. hard_token_limit = 65536 hard_msg_limit = 500 [memorize] # Conversation mode. Selects what boundary detection sees and which pipelines run: # "chat" -> tool rows dropped + user_memory only # "agent" -> tool rows kept in the cells + user_memory + agent_memory # A single service process serves one mode at a time; switching mode # requires a restart. Override via EVEROS_MEMORIZE__MODE. mode = "agent" # Maximum wall-clock for one add() / flush() invocation while holding the # per-session lock. On timeout the outer asyncio.timeout cancels the call # and the lock auto-releases so subsequent concurrent /add on the same # session aren't deadlocked. Covers boundary LLM + memcell writes + # synchronous portion of pipeline dispatch. # Override via EVEROS_MEMORIZE__SESSION_LOCK_TIMEOUT_SECONDS. session_lock_timeout_seconds = 360.0 # How long a memory deletion of one session (POST /memory/delete with only # session_id) waits for an add() in progress on that session; past it the # deletion returns 503 SESSION_BUSY and deletes nothing. delete_wait_seconds = 10.0 [memorize.async_queue] # Queue behind ``async_mode=true`` on /add (a /flush joins it only behind its # session's backlog). Off -> such requests run synchronously; rows accepted # while it was on are still delivered. enabled = true # Batches delivered at once, never two from one session: a session's batches # run in arrival order, sessions run side by side. 1 serialises everything. max_concurrency = 4 # Unfinished rows per session; beyond this /add and /flush answer 429. max_pending_per_session = 50 # Unfinished rows across all sessions; beyond this the answer is 429. max_pending_total = 200 # One request body (serialised); beyond this the answer is 413. max_payload_bytes = 4194304 # Fallback sweep interval. Enqueue wakes the worker immediately. scan_interval_seconds = 5.0 # Delivery attempts per row before it is marked failed and skipped. Keep 1 # unless duplicate memcells after a partial failure are acceptable: the # memorize pipeline is not atomic, so a re-run is not a clean retry. max_attempts = 1 retry_backoff_seconds = 2.0 # A row in flight when the process died is replayed on the next start; after # this many replays without finishing it is marked failed (poison-pill guard). max_replays = 3 # Rows (any status) are deleted this many hours after they were created. row_retention_hours = 168.0 [agent_memory] # Put everalgo's correctness gate in front of agent-case extraction: the # extraction LLM judges whether the work in a conversation was completed # correctly (one extra call per conversation), and only admitted ones become # cases. Off -> cases are admitted by the complexity and value filters. # Needs a restart. Override via EVEROS_AGENT_MEMORY__CASE_GATE_ENABLED. case_gate_enabled = false [knowledge] # Max bytes for an uploaded knowledge document (default 50 MiB). Oversized # uploads are rejected with HTTP 422 before parsing/extraction. Note: the # multipart body is still buffered by the server first, so set a reverse-proxy # / gateway body-size limit for hard ingress protection. # Override via EVEROS_KNOWLEDGE__MAX_UPLOAD_BYTES. max_upload_bytes = 52_428_800 # 50 MiB [knowledge.search] recall_n = 200 rerank_n = 50 # "lambda" is a Python keyword — aliased as "lam" in Settings lambda = 0.1 mass_top_m = 50 top_k_cap = 100 [clustering] # Geometry-clustering: cosine similarity threshold and time window. # Episodes older than ``time_window_days`` from the newest cluster # member are excluded from merge consideration. # Override via EVEROS_CLUSTERING__THRESHOLD, EVEROS_CLUSTERING__TIME_WINDOW_DAYS. threshold = 0.65 time_window_days = 7.0 [cascade] # Run the cascade (watcher + scanner + worker) that projects md into the index. # Off -> md edits never become searchable; only for runs that never search or # that drive `everos cascade sync` themselves. enabled = true # Run the filesystem watcher. Off -> the scanner alone picks up md edits, one # scan_interval_seconds later. Use it on a host whose inotify watch limit is # exhausted (the server would otherwise die at startup with Errno 28); unlike # enabled = false, md still reaches the index. watcher_enabled = true # Maintenance cadences (seconds). Deadlines that bound a hung call are not # here on purpose — they live next to the code they guard and are sized from # measurement, not preference. optimize_heartbeat_seconds = 60.0 optimize_prune_interval_seconds = 300.0 # Passed to LanceDB as cleanup_older_than. Only has to outlive an in-flight # read, but it also decides how long index files keep a manifest naming them: # under LanceDB's 7-day unverified window they then wait out the full 7 days. optimize_prune_retention_seconds = 60.0 optimize_rebuild_interval_seconds = 43200.0 # How often the scanner walks the memory root for changes the watcher missed. # On a mount that delivers no filesystem events (a Windows directory bound into # WSL2 or a container) this is the edit-to-searchable latency. Every sweep also # stats every md file, which over a slow mount is the cost of a short interval. scan_interval_seconds = 30.0 # A memory deletion fences the index rows it removed until the cascade runs # that started before it end; above this many entries it logs # memory_delete_fence_large (some run is not ending). delete_fence_warn_entries = 100000 [ome] # Offline memory engine tunables. Not to be confused with /ome.toml, # which overrides individual strategies (enabled / gate / cron). # Engine-wide cap on concurrent strategy runs. Each slot mostly waits on a # remote extraction call, so a bulk ingest can afford far more than this. max_concurrent_runs = 20 # Wall-clock ceiling (seconds) on one strategy attempt: a deadlock backstop, # not a latency target -- too low kills slow-but-healthy extractions. 0 disables. run_timeout_seconds = 1800.0 [logging] # Console log level: DEBUG | INFO | WARNING | ERROR. `everos server start # --log-level` (or EVEROS_LOG_LEVEL) overrides it for the server; interactive # commands (cascade / init / config / demo) log WARNING, INFO with --verbose. level = "INFO" [observability] # OpenTelemetry tracing export. Off by default; pure OTLP/HTTP, vendor-neutral # (Langfuse, an OTel Collector, or any OTLP backend). EverOS ships no vendor SDK. # Override via EVEROS_OBSERVABILITY__ENABLED, EVEROS_OBSERVABILITY__ENDPOINT, etc. enabled = false exporter = "otlp_http" # "otlp_http" | "none" endpoint = "" # e.g. https://us.cloud.langfuse.com/api/public/otel/v1/traces service_name = "everos" sample_rate = 1.0 # 0.0 to 1.0 # Privacy: false (default) = metadata only; true also emits query / extracted # memory / .md paths as span input/output (redacted + truncated). capture_content = false # Recall-quality scores pushed to Langfuse (Langfuse-specific REST, off the # OTLP stream). Only fires when langfuse_public_key/secret_key/host are set # (via everos.toml or EVEROS_OBSERVABILITY__LANGFUSE_* — secrets, not shipped here). # Score names: "recall_top_score" for the calibrated methods (HYBRID / AGENTIC, # [0, 1] and comparable), "recall_top_score_raw" for the uncalibrated ones # (KEYWORD BM25 / single-route VECTOR), plus "recall_hit" for calibrated only. emit_recall_scores = true recall_hit_threshold = 0.6 # only meaningful for calibrated methods