Runtime settings
Every setting is an environment variable LOOM_<FIELD> read at startup, and can also go
in the YAML settings file (configuration reference). A
setting the reference marks live also takes a deployment-wide override while Loom
runs (among them retrieval and ranking, memory_search_*; answer synthesis,
memory_ask_*; extraction, context and knowledge tuning; and ClickHouse insert batching,
ch_batched_insert*). Every other setting is read once at startup and changes with a
restart. The similarity gates that calibration replaces
(memory_search_min_similarity, memory_search_abstain_threshold,
memory_search_hyde_fallback_threshold, memory_search_query_rewrite_threshold) are not
live: with LOOM_ADAPTIVE_THRESHOLDS on they apply only when there is no calibration.
See what is in force
loom settings list --changed # off its default, or overridden
loom settings list --prefix memory_ask_ # one area
loom settings list --json
Each line shows the value, where it came from and whether it is live:
memory_ask_recency_weight = 0.35 (override, live)
ch_host = "clickhouse" (env)
| Source | Meaning |
|---|---|
override |
set with loom settings set or /v1/admin/settings.set |
dashboard |
the model configuration saved in Settings → Models & keys |
env |
the process environment |
env_file |
the dotenv file (LOOM_ENV_FILE, default .env), also when copied into the environment |
settings_file |
the YAML settings file (LOOM_SETTINGS_FILE), also when scripts/serve.sh exports it |
inferred |
filled in at startup from other settings (the LLM provider, a local model's width) |
default |
the built-in default |
A secret shows only its length.
Override a live setting
loom settings set memory_ask_recency_weight 0.35
loom settings reset memory_ask_recency_weight
The value is written as its environment variable would be and validated the same way: a
value out of range, or a setting that is not live, is refused and nothing is stored. The
override is one row of loom.runtime_overrides. The process that stores it applies it at
once; every other process, the workers included, applies it within
LOOM_RUNTIME_OVERRIDES_REFRESH_SECONDS (default 10). It outlives a restart and wins over
the environment and the settings file until it is reset; resetting puts back each
process's own value or the default. reset refuses a setting with no stored override, and
removes the override of a setting a later build no longer has. Each change writes a
setting.changed audit row with the value before and after.
--expect <value> (expected over HTTP) changes nothing unless that is the value in
force after a fresh read of the stored overrides, and answers 409 PRECONDITION_FAILED
with the value it found: a change made since through another replica or the CLI is not
overwritten unseen. Two changes sent in the same instant can still both pass.
See and undo past changes
loom settings history memory_ask_recency_weight
loom settings history --limit 20 # every setting
Each line is one recorded change, newest first: when, who (cli:<user> or the token
subject) and the value before and after. A value before that was an override is the
deployment's: undo by setting it back with loom settings set. Any other was the value
on the process that made the change (its environment or a default), marked
(undo: reset): undo with loom settings reset, which puts back each replica's own. A
change with no value before (the reset of a setting this build no longer has) has nothing
to undo.
An override is the deployment's default, so what a namespace or a request sets still wins
over it: a namespace's retrieval_defaults (top_k, min_similarity,
reinforcement_weight and the other search knobs namespace.register takes) and a
request's own fields.
The same operations over HTTP, with a platform admin token. With auth off, a change is
accepted only on a loopback address (localhost): a web page could otherwise reach it
through DNS rebinding.
curl -s "$LOOM_BASE_URL/v1/admin/settings.list" -H "Authorization: Bearer $TOKEN" \
-H 'content-type: application/json' -d '{"changed": true}'
curl -s "$LOOM_BASE_URL/v1/admin/settings.set" -H "Authorization: Bearer $TOKEN" \
-H 'content-type: application/json' -d '{"name": "memory_ask_recency_weight", "value": 0.35}'
curl -s "$LOOM_BASE_URL/v1/admin/settings.set" -H "Authorization: Bearer $TOKEN" \
-H 'content-type: application/json' -d '{"name": "memory_ask_recency_weight", "clear": true}'
POST /v1/admin/settings.history takes {"name": "...", "limit": 50}. The Python SDK
has agent.deployment.settings(), set_setting(name, value, expected=...),
reset_setting(name, expected=...) and setting_history(name).
During a rolling upgrade
A build that does not have a setting, does not read it live, or whose field refuses the
stored value, logs the stored override once and ignores it; the other processes keep
applying it. A build from before runtime settings existed ignores the stored overrides
without a word, so while one still serves, an override applies on the newer replicas
only. Ranking settings change what memory.search returns: measure a change with a
benchmark before you keep it (running a benchmark).