Config Keys¶
The keys you actually change. Curated, not exhaustive — every key with its live/inert status is in the Configuration Reference; the why is in §09 — Configuration.
Resolution in one line¶
appsettings.json < {Environment}.json < env vars < appsettings.Local.json < SystemSettings (DB, runtime, no restart). So appsettings.Local.json beats environment variables, and a meaningful SystemSettings row beats the file layers.
Secrets live only in gitignored appsettings.Local.json; committed files keep REPLACE_ME_VIA_LOCAL_OVERRIDE.
Most-changed keys¶
| Key | Default | Layer | Controls |
|---|---|---|---|
ConnectionStrings:DefaultConnection |
Host=localhost;…;Database=aetherium_refactor_db;… |
appsettings | Postgres connection (set password locally) |
Aetherium:Storage:WorkspaceRoot |
${AETHERIUM_WORKSPACE_ROOT} → platform default |
appsettings | Workspace root |
Aetherium:Storage:GlobalKnowledgePath |
${AETHERIUM_KNOWLEDGE_PATH} → platform default |
appsettings | Global knowledge library |
WorkspaceRootPath / DefaultProjectPath / GlobalKnowledgePath |
(empty → file wins) | SystemSettings | Runtime path overrides |
AI_ModelId |
(unset) | SystemSettings | Operator-wide default model |
AI_WorkerModelId |
(unset) | SystemSettings | Non-supervisor worker default |
AI_SupervisorModelId |
falls back to AI_ModelId |
SystemSettings | Layer-2 gap-detection model |
AI_VerificationEnabled |
false |
SystemSettings | Step verifier for teams without a verification block (template block wins) |
AI_VerifierModelId |
falls back to AI_SupervisorModelId → AI_ModelId |
SystemSettings | Judge model for step verification |
AI_TrajectoryJudgeModelId |
falls back to the team's verifier_model_id → AI_SupervisorModelId |
SystemSettings | Judge model for the end-of-run trajectory evaluation |
AI_BaseUrl |
http://localhost:1234 |
SystemSettings | LM Studio chat endpoint |
SearXNG_Url |
(unset → DuckDuckGo) | SystemSettings | web_search backend |
Aetherium:Research:SearchMinIntervalMs |
1500 |
appsettings | Minimum spacing between outbound web_search calls, process-wide (clamped 0–30000) |
ChromaDb:Endpoint |
http://localhost:8000 |
appsettings | ChromaDB REST endpoint |
ChromaDb:ScoreFloor |
0.525 |
appsettings | Lowest cosine similarity a retrieved chunk may have |
AI_KnowledgeInjection |
on | SystemSettings | false stops knowledge injection into prompts; benchmark mode always stops it |
Knowledge_ActiveGeneration |
0 |
SystemSettings | Generation of knowledge collections that reads and writes use (aetherium_global_g1, …); flipping back rolls back |
Aetherium:KnowledgeIndex:WorkRoot |
/var/lib/aetherium/kb-rebuild |
appsettings | Records of each index rebuild (export, manifest, report) |
Aetherium:KnowledgeIndex:KbRoot |
/var/lib/aetherium/kb |
appsettings | Promotion candidates and approved domain documents, kept as files |
Aetherium:KnowledgeIndex:*Gate |
0.9 self · 0.9 known-item · 0.95 overlap · 0.999 fingerprint |
appsettings | Checks a rebuilt generation must pass before it goes live |
Container_IdleTimeoutMinutes |
60 |
SystemSettings | Idle → stop |
Container_DestroyGracePeriodMinutes |
30 |
SystemSettings | Stopped → destroyed |
Container_CleanupIntervalMinutes |
5 |
SystemSettings | Cleanup poll interval |
MaintenanceMode |
false |
SystemSettings | true → 503 on build/create routes |
ToolApproval_TimeoutSeconds |
300 |
SystemSettings | Restricted-tool approval window |
Aetherium:VramOrchestration:Enabled |
true |
appsettings | Per-run model residency and affinity pins |
Aetherium:VramOrchestration:PreemptGraceSeconds |
20 |
appsettings | Grace a preempted batch lease gets before its model is unloaded |
Aetherium:VramOrchestration:Services |
(empty) | appsettings | GPU services (systemd user units) a lease may name; started, budgeted and stopped by the arbiter, kept warm for an optional LingerSeconds after the last lease |
Aetherium:VramOrchestration:ProtectedStandardSetSlots |
["Secondary"] |
appsettings | Slots whose standard set no lease may evict |
Aetherium:VramOrchestration:ServiceStartMaxCelsius |
0 (off) |
code | CPU temperature (k10temp Tctl) above which a lease waits to start a GPU service on the Engine's own machine |
Aetherium:VramOrchestration:DefaultNodeInstance |
Worker |
appsettings | Slot a node that names a model but no slot runs on, when that slot holds its model |
Aetherium:Tts:BaseUrl |
http://127.0.0.1:8100/v1 |
appsettings | The voice service tts_render posts to (/audio/speech) |
Aetherium:Tts:RefsDir |
~/.cache/dnd-models/tts-qwen/refs |
appsettings | Reference clips (<name>.wav + <name>.txt) the voice tools can clone |
Aetherium:Tts:DefaultVoice |
host |
appsettings | Reference voice for a speaker the voice map does not name |
Aetherium:Tts:GapSeconds |
0.18 |
appsettings | Silence between spoken lines in a rendered MP3 |
Aetherium:Tts:DesignBaseUrl |
http://127.0.0.1:8101/v1 |
appsettings | The voice design service that turns a design: … voice into a reference clip |
Aetherium:Tts:RelayVoices |
(empty) | appsettings | Voice names POST /v1/audio/speech accepts, each mapped to a reference clip under RefsDir |
Aetherium:Tts:RelayIdleMinutes |
10 |
appsettings | How long the speech relay keeps the voice service running after its last request |
AI_InferenceLeaseIdleMinutes |
15 |
SystemSettings | Idle window of an interactive inference lease (the /v1 relay) |
Aetherium:LMStudio:Instances:<slot>:Backend |
LmStudio |
appsettings | LlamaServer serves the slot from a llama.cpp llama-server in router mode (context set by the server's preset, not per load) |
AI_StepRepairRounds |
2 (0–4) |
SystemSettings | Extra rounds after a deliverable-gate failure only, on top of AI_StepRounds |
AI_RepetitionRuleArmed |
false |
SystemSettings | Lets the repetition rule bounce a looping agent; off, it only logs [REP-RULE] |
AI_ImageExampleArm |
unset (arm A) | SystemSettings | B drops the booster from comfyui_generate's example prompt, for an A/B; unset is the shipped schema |
Aetherium:Decision:Enabled / :Shadow |
false / false |
appsettings | The decision layer's semantic-repetition guard; Shadow asks and logs but never bounces |
Aetherium:LMStudio:Instances:<slot>:InteractiveCopies |
Secondary: gemma-4-e4b-it → gemma-interactive | appsettings | A second loaded copy that serves interactive relay traffic |
Aetherium:LMStudio:Instances:<slot>:Card |
(unset) | appsettings | The Aetherium:Gpus:Cards card the slot runs on; its unit is pinned to that card |
Aetherium:LMStudio:Instances:<slot>:Machine |
(unset) | appsettings | Display only: the machine the Inference page groups the slot under; needed for a slot on another machine reached through a local port forward |
Aetherium:LMStudio:Instances:<slot>:RestoreDelaySeconds |
0 |
appsettings | Wait after the slot's last lease ends before restoring its standard set; each release restarts it |
Aetherium:Gpus:Cards |
(empty) | appsettings | The GPUs by name: ROCm Uuid, VulkanDevice for a Vulkan build; Host (SSH destination) and ListenAddress for a card in another machine |
Aetherium:Gpus:RemoteSshKey |
(unset) | appsettings | Identity file for SSH to a card's Host; that machine forces it to services/aetherium-gpu-node |
Aetherium:LMStudio:SlotOrder |
Primary, Secondary, then by name | appsettings | Order failover tries alternate slots in, and the relay looks for a model in |
Aetherium:RolePlacement:<role> |
(empty) | appsettings | {Slot, Pin} for a side role (Verifier, TrajectoryJudge, Embeddings, Compaction, …) |
Aetherium:LMStudio:OfflineFallbackSlot |
(unset) | appsettings | Slot an unpinned side role runs on while its own slot is known down (last two health probes failed); unset, it stays and fails |
Aetherium:Embeddings:ModelId |
text-embedding-nomic-embed-text-v1.5 |
appsettings | Model id the knowledge index embeds with (a llama-server router needs a preset name); with PrefixScheme it is the index's stamp |
Aetherium:Embeddings:RawModelId |
text-embedding-nomic-embed-text-v1.5 |
appsettings | Model id of the untemplated path lessons use |
Aetherium:ImageFinishing:Enabled |
false |
code | 2K re-render of a Qwen-Image team's images after each Completed run |
AI_InstanceAvailabilityCheck |
true |
SystemSettings | Scheduler instance-availability layer; false disables it without a redeploy |
AI_ReasoningEffort |
(unset → off) | SystemSettings | low/medium/high/xhigh reasoning on the two planning turns only (worker turns: the template's config.reasoning_effort) |
Aetherium:Finishing:AutoTrigger |
false |
appsettings | true → a build reaching Completed opens a finishing gate for that project (unattended design work on every finished build) |
Finishing_DirectorModel / Finishing_DirectorInstance |
template's pins | SystemSettings | Model and slot for the finishing team's director and designer |
Finishing_WorkerModel / Finishing_WorkerInstance |
template's pins | SystemSettings | Model and slot for its researchers and writer; a model without its slot stays on Primary |
ModelRegistry:Path |
built-in default | appsettings / env | Benchmark model registry; configured-but-missing is fatal at startup |
Aetherium:ModelRegistry:FailOnMissing |
(unset) | appsettings | Force the registry check on or off |
Model resolution¶
Per-agent model resolves: node model_id → registry routing → AI_WorkerModelId (workers) → team default (AI_ModelId → template team.config.model → loaded model → local-model).
Cloud-prefixed IDs are skipped
A candidate that is empty, "default", or starts with gpt-, claude-, o1-, o3-, gemini-, palm-, command- is skipped by the local-inference path. A stray gpt-4o left in any tier is silently ignored, not dispatched.
Two LM Studio homes (a classic trap)¶
Chat/routing reads SystemSettings (AI_BaseUrl, LMStudio_MultiInstanceConfig); model-management/VRAM reads the Aetherium:LMStudio:Instances:* appsettings block. They are not synced for Primary and Secondary — set the endpoint you actually chat against in the Settings page. Any other slot's runtime row is built from its registry entry.
Don't bother — inert keys¶
These look configurable but do nothing today (full list in the Configuration Reference):
Aetherium:Cleanup:IdleTimeoutMinutes(and the other timers there) — shadowed by theContainer_*SystemSettingsrows; change those instead.ChromaDb:DefaultCollection;Gemini:ApiKey. (TheAetherium:Docker:*andAetherium:Pools:*sections were removed on 2026-09-06; the container-pool and agent-isolation keys followed on 2026-09-07, along with the code behind them.)
No retention on the audit table
The tool-security audit table grows without bound — no config key. Prune it yourself (Commands · backup).