AgentX docs

Settings Reference

Every setting the app exposes, generated from the same declarations the settings screen reads. If a setting is described here, that description is the one you’ll see beside the control; if it isn’t listed here, the app doesn’t offer it.

Where things are stored. config settings live in data/config.json and are written through POST /api/config/update. memory settings live in data/memory_settings.json and are written through the two /api/memory/* settings endpoints. A setting with no write route is read-only over the API — set it in .env or the settings file directly, and restart.

Defaults. Every value below ships with the default shown. Changing nothing leaves you on a working configuration; the settings screen marks anything you’ve moved and offers to put it back.

Documented settings

These carry the full write-up. The rest of the catalogue is tabulated below, and is being written up section by section.

compression.enabled

Summarise a single tool result that comes back too large.

Default: true · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. Compression of one oversized tool output, before it enters the turn.

How it works. A result past the size threshold is summarised task-aware — with the question in view — so what survives is the part that answers it.

When to change it. Leave it on. A single large page or query result can otherwise consume the whole turn. Off, oversized results are truncated instead, which cuts arbitrarily.

Managing it. Distinct from trajectory compression, which compresses across rounds. This one shrinks a single result.

compression.max_summary_chars

How much of an oversized tool result survives compression.

Default: 2000 · Range: 500 to 10000, characters · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. The size budget for the summary that replaces a too-large result.

How it works. The compressor writes within this budget, keeping what answers the query.

When to change it. Raise it when compressed results lose specifics the agent needed — figures, names, exact wording. Lower it when tool output still crowds the turn.

Managing it. Default 2000 characters. If you find yourself raising this a lot, the more effective fix is usually a narrower tool query.

compression.model

Which model summarises oversized tool results.

Default: (empty) · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. The model used for task-aware compression of a single result.

How it works. Empty follows the Summarizer role; an explicit value overrides it here only.

When to change it. Override when tool-heavy turns feel slow and this is where the time is going.

Managing it. Readers floor to a small fast model.

context.conversation_state_compaction_enabled

Fold aged-out turns into the structured digest instead of free prose.

Default: true · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. Which of the two summary mechanisms receives compacted history.

How it works. On, aged-out turns roll into the conversation state’s digest field, re-summarised in place. Off, they fall back to the legacy free-prose rolling summary.

When to change it. The structured digest is the better default — it sits beside the goals and decisions it relates to, and it’s editable. The prose fallback exists for comparison and for conversations where the structure gets in the way.

Managing it. Inert when context.conversation_state_enabled is off.

context.conversation_state_enabled

Keep a structured working memory for the conversation.

Default: true · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. A per-conversation record of goals, decisions, open threads and artifacts — plus the rolling digest of aged-out turns.

How it works. Rendered into the prompt as a ledger block. The agent maintains it deliberately through the update_conversation_state tool, and you can edit it yourself from the composer badge.

When to change it. Leave it on for anything long-running: it’s what lets an agent still know the goal after the turn that stated it has aged out. Turning it off hides the block and removes the agent’s tool for it.

Managing it. Structured state is also the default compaction target — see context.conversation_state_compaction_enabled.

context.max_input_tokens

Optional hard ceiling on what one turn may spend on input.

Default: 0 · Range: 0 to 1000000, tokens · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. A per-turn spend guard for the tool loop, in tokens. 0 turns it off.

How it works. With a value set, a turn stops growing its input past this ceiling even if the model’s window would allow more — a brake on runaway multi-round tool loops.

When to change it. Set it when you want a predictable per-turn cost ceiling on an expensive model. Leave it at 0 to let the model’s real window govern, which is the right default now that windows are read accurately.

Managing it. This replaced a flat 32k cap that quietly strangled large-window models. Setting it too low reintroduces exactly that problem — prefer the model’s own window unless you have a billing reason not to.

context.preassembly_summary_enabled

Refresh the digest mid-turn rather than let anything drop uncovered.

Default: true · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. The backstop that guarantees nothing leaves the model’s view without being summarised first.

How it works. Before assembling an over-budget turn, the digest is refreshed so the turns about to age out are already covered. If the summarizer is unavailable, a deterministic fallback digest stands in — coverage does not depend on a model call succeeding.

When to change it. Leave it on. Off, a turn that outgrows its budget can drop history that the digest hasn’t caught up with yet, and the agent silently forgets something you said. The cost is one extra summarisation on the turns that need it.

Managing it. Pre-warm (context.summary_trigger_ratio) is what keeps this from firing often — this is the safety net, not the mechanism.

context.recent_floor

How many recent turns are never summarised, whatever the pressure.

Default: 4 · Range: 1 to 50, turns · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. The number of most-recent turns that always stay word-for-word.

How it works. Compaction works from the oldest turn forward and stops here. Even a conversation well over budget keeps this many exchanges intact.

When to change it. Raise it if the agent loses the thread of what was just said — the immediate back-and-forth is where that lives. Lower it only if you are severely context-constrained and would rather keep older material in view.

Managing it. Four turns is enough for the model to see what it just said and what you replied. High values interact with the verbatim budget: the floor wins, so setting both aggressively can push assembly against its hard cap.

context.rehydrate_max_turns

How far back to read when reopening a cold conversation.

Default: 400 · Range: 20 to 2000, turns · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. The cap on turns pulled from durable history when a session is resumed.

How it works. Reopening a conversation the server no longer holds in memory replays up to this many turns from storage to rebuild context.

When to change it. Raise it for long-lived conversations you return to across days. Lower it if reopening a large conversation is slow — the cost is read volume at open time, not per turn.

Managing it. This bounds what is read, not what is sent: the verbatim budget still decides how much of it reaches the model.

context.summary_trigger_ratio

When to prepare the digest, ahead of actually needing it.

Default: 0.85 · Range: 0.5 to 0.98, of the history budget · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. The point at which compaction runs after a turn, so the digest is already fresh the next time older turns need to leave the verbatim window.

How it works. Measured against the turn’s real history budget (input budget minus granted preamble blocks). Crossing it schedules a post-turn pre-warm that folds the oldest turns into the digest.

When to change it. Keep it slightly below the verbatim budget — that gap is the whole point. Pre-warm does the summarising between turns, where you don’t feel it; if this sits at or above the verbatim ceiling, the work lands in the middle of a turn instead and you wait for it.

Managing it. Default 0.85 against a 0.9 verbatim budget. Move the two together and keep the gap; closing it doesn’t save anything, it only changes when you notice the cost.

context.verbatim_budget_ratio

How much of the model’s context window the word-for-word transcript may fill.

Default: 0.9 · Range: 0.5 to 0.98, of the context window · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. The ceiling on the verbatim window — the stretch of recent conversation the model sees exactly as it happened, rather than as a summary.

How it works. Each turn is sized against the model’s real context window, not a fixed number. Turns are kept verbatim until they would exceed this fraction of it; older ones fold into the conversation-state digest. Assembly still hard-caps at window − reserved output, so this can never squeeze out the reply.

When to change it. Lower it to leave room for a long answer, or if you are paying per token and would rather summarise sooner. Raise it to keep more exact wording in view — worth it when detail matters more than cost. It was 0.7 and is now 0.9 deliberately: compressing at 70% of a large window discarded detail long before anything was actually short of room.

Managing it. With a correct window configured (Model Limits), most conversations never compact at all. If yours compact constantly, check the model’s declared window before touching this — an understated window is the usual cause.

memory.episodic_leads_enabled

Offer pointers to earlier conversations that look related.

Default: true · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. Short leads drawn from episodic memory — “we discussed this on…” — rather than full recalled content.

How it works. Derived per turn and injected as a low-priority block, so they yield to the transcript and the state ledger when room is tight.

When to change it. Leave it on for continuity across conversations. Turn it off if leads to unrelated past chats are distracting the agent, or if you want per-turn context strictly scoped to the conversation at hand.

Managing it. Leads are pointers, not recall; the Recall layer is what fetches actual content. They ride at low priority and are the first thing dropped under pressure.

session.rolling_summary.enabled

Whether conversations compact automatically at all.

Default: true · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. The master switch for automatic compaction, whichever target it writes to.

How it works. Off, no automatic summarisation runs: turns stay verbatim until they hit the budget and then simply leave view.

When to change it. Leave it on. Off is for diagnosing whether a context problem comes from compaction — useful briefly, lossy as a standing setting.

Managing it. Gates both the structured digest and the legacy prose summary. Named for the original prose mechanism, which the digest has since superseded as the default.

session.rolling_summary.max_tokens

How long one compaction pass may make the digest.

Default: 800 · Range: 200 to 4000, tokens · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. The output budget for a single summarisation pass.

How it works. The digest is re-summarised in place on each pass, so this effectively bounds its steady-state size rather than letting it grow with the conversation.

When to change it. Raise it when long conversations lose detail you needed. Lower it when the digest itself is eating the context you wanted for live turns.

Managing it. Default 800 tokens. Because each pass rewrites the whole digest, raising this raises both the summarisation cost and the standing per-turn cost of carrying it.

session.rolling_summary.model

Which model writes the compaction summaries.

Default: (empty) · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. The model used to fold aged-out turns into the digest.

How it works. Empty follows the Summarizer role, which is the recommended setting — set the role once and every summarising job follows it. An explicit value overrides the role for this job only.

When to change it. Override it when compaction specifically is too slow or too lossy, and you want a different trade-off here than for other summarising work.

Managing it. Readers floor this to a small fast model regardless; compaction runs often and rarely benefits from a large one.

trajectory_compression.enabled

Compress earlier tool rounds during a long turn.

Default: true · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. In-turn compression of the trajectory — the accumulated tool calls and results within a single turn.

How it works. When a turn’s context crosses the trigger threshold, earlier rounds are replaced by a compact knowledge block, keeping the most recent rounds intact.

When to change it. Leave it on for agents that use tools heavily; a research or multi-step turn can otherwise fill the window with intermediate results before it reaches an answer. Off, long tool loops hit the ceiling sooner.

Managing it. Distinct from tool-output compression, which shrinks one oversized result.

trajectory_compression.max_knowledge_chars

How large the compressed knowledge block may be.

Default: 3000 · Range: 500 to 10000, characters · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. The size cap on the block that replaces compressed tool rounds.

How it works. The compressor writes within this budget; the block persists for the rest of the turn.

When to change it. Raise it when compression is dropping details the agent then has to re-fetch — re-running a tool costs more than carrying a few hundred extra characters. Lower it when the block itself is crowding the turn.

Managing it. Default 3000 characters. Weigh against the cost of the tool call it saves.

trajectory_compression.model

Which model compresses tool rounds mid-turn.

Default: (empty) · Found in: Memory → Conversation Context · Set via: /api/config/update

What it is. The model that writes the knowledge block replacing earlier rounds.

How it works. Empty follows the Summarizer role; an explicit value overrides it here only.

When to change it. Override when in-turn compression is adding noticeable latency — this one runs inside the turn, so its speed is felt directly.

Managing it. Readers floor to a small fast model; latency matters more than nuance here.

trajectory_compression.preserve_recent_rounds

How many recent tool rounds survive compression untouched.

Default: 2 · Range: 1 to 5, rounds · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. The number of most-recent tool-call rounds always kept in full.

How it works. Compression works forward from the oldest round and stops here.

When to change it. Raise it if the agent loses track of what a tool just returned. Lower it to reclaim more room when rounds are large.

Managing it. Two rounds is usually enough to keep the immediate call-and-result pair intact. This is a floor, like context.recent_floor but within a turn.

trajectory_compression.threshold_ratio

How full a turn gets before earlier tool rounds are compressed.

Default: 0.75 · Range: 0.5 to 0.95, of the turn budget · Found in: Memory → Conversation Context · Set via: /api/config/update · Advanced — behind the disclosure in Settings.

What it is. The fraction of the turn’s budget that triggers in-turn compression.

How it works. Crossing it compresses all but the most recent rounds into a knowledge block.

When to change it. Lower it for agents that routinely run long tool loops — compressing earlier keeps more headroom for the rounds that matter. Raise it to keep raw tool output visible longer, at the cost of hitting the ceiling sooner.

Managing it. Default 0.75. Below about 0.5 you compress work that had room to breathe.

cross_encoder_enabled

Re-score the shortlist with a slower, more accurate model before answering.

Default: true · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The second stage of retrieval. The fast searches propose a pool of candidates; a cross-encoder then reads each candidate together with the query and re-orders them. Worth about +20pp MRR on the golden recall set.

How it works. Stage 1 deliberately over-fetches recall_candidate_pool candidates. Stage 2 scores each one against the query with cross_encoder_model — which, unlike an embedding search, sees query and candidate at the same time and can judge whether one actually answers the other — then cuts back to top-k. The model lazy-loads on first use, and a failure is non-fatal: recall falls back to stage-1 order.

When to change it. Leave it on. It is the single largest accuracy win in the recall path. Turn it off only where the model cannot be loaded, or where per-turn latency is tighter than answer quality.

Managing it. Governs recall_candidate_pool and recall_ce_max_demotion — with this off, both are inert. First use pays a one-time model load.

cross_encoder_model

The Hugging Face cross-encoder that re-scores candidates.

Default: cross-encoder/ms-marco-MiniLM-L-6-v2 · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. A local sentence-transformers cross-encoder identifier, loaded on first recall.

How it works. Downloaded and cached on first use, then held in memory. It runs locally on CPU or GPU — no API calls, no per-query cost, so it never appears in usage or spend.

When to change it. Change only to trade size against accuracy. The default (ms-marco-MiniLM-L-6-v2) is small and fast and is what the +20pp figure was measured with; a larger ms-marco variant scores better and costs more latency and memory per turn.

Managing it. Must be a cross-encoder, not a bi-encoder or embedding model — an embedding model here will load and produce meaningless scores rather than fail loudly. Changing it triggers a fresh download on the next recall.

recall_candidate_pool

How many candidates the reranker gets to look at.

Default: 50 · Range: 10 to 200, candidates · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The size of the shortlist stage 1 hands to stage 2. Deliberately much larger than the number of facts that end up in the prompt.

How it works. The fused searches keep this many candidates; the cross-encoder scores all of them and the top-k survive. Reranking cost scales roughly linearly with this number.

When to change it. Raise it when the right fact exists but never reaches the prompt — a bigger pool gives the reranker a chance to find something the fast search ranked poorly. Lower it when recall is accurate but slow. Below about 20 the reranker has nothing to work with and the whole second stage stops earning its cost.

Managing it. Pointless without cross_encoder_enabled. The default of 50 against a typical top-k of 5–10 is roughly a 5–10× over-fetch, which is the intended shape.

recall_ce_max_demotion

How far the reranker may push a candidate down — a hedge against its blind spots.

Default: 2 · Range: 0 to 20, places · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. A cap on the reranker’s pessimism. It may promote a candidate as far as it likes, but it may only demote one this many positions below where fusion placed it.

How it works. After scoring, each candidate’s new rank is clamped so it cannot fall more than this many places relative to its fused rank. Promotion is unclamped.

When to change it. Cross-encoders are strong on average and occasionally confidently wrong — a fact the keyword and vector searches both ranked first should not vanish because one model disliked it. Raise it if you trust the encoder more than fusion; set it to 0 to freeze fusion’s order against any demotion at all.

Managing it. Asymmetric by design; don’t read it as a general “trust” dial. Values above ~5 effectively remove the hedge, since few candidates move that far.

recall_enable_entity_centric

Find facts by walking the entity graph instead of matching text.

Default: true · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. A retrieval path that goes through things rather than words. When a query names an entity the agent already knows, its facts are pulled directly from the graph.

How it works. Entities are matched from the query above recall_entity_similarity_threshold, up to recall_entity_max_entities of them. Facts attached to those entities are collected, following relationships out to recall_entity_graph_depth hops.

When to change it. Keep it on when the agent accumulates knowledge about recurring people, projects, or systems. It answers questions text search cannot — “what do we know about Redis” returns facts that never contain the word “Redis” but hang off that entity. The cost is a graph query per turn.

Managing it. If it returns loosely-related material, raise recall_entity_similarity_threshold before reaching for graph depth. Depth is the expensive dial, not the threshold.

recall_enable_hybrid

Search memory by keyword and by meaning at once, then fuse the two rankings.

Default: true · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The default way memory is searched. Two searches run over the same facts: BM25 keyword matching (does this text contain these words?) and vector similarity (does this text mean something close?). Their rankings are then merged.

How it works. Both searches run against the channel list for the turn, each producing a ranked list. The lists are fused with Reciprocal Rank Fusion — a fact scores on where it placed in each list rather than on raw scores, so two incomparable scoring systems can be combined without normalising them. A fact ranked well by both rises highest.

When to change it. Leave it on. Keyword-only search misses paraphrase (“what does she drive” vs “her car is a Volvo”); vector-only search misses exact tokens (identifiers, error codes, names it has never seen). Fusing covers both failure modes at the cost of one extra query. Turn it off only to isolate a retrieval problem while debugging.

Managing it. The balance between the two is recall_hybrid_bm25_weight and recall_hybrid_vector_weight; the fusion constant is recall_hybrid_rrf_k. With this off, those three do nothing.

recall_enable_hyde

Imagine the answer first, then search for facts that look like it.

Default: false · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. Hypothetical Document Embedding. Instead of searching with the question, the agent drafts a plausible answer and searches with that — because a made-up answer sits much closer in vector space to the real one than the question does.

How it works. A small model (recall_hyde_model) writes a short hypothetical answer at recall_hyde_temperature, capped at recall_hyde_max_tokens. That text is embedded and used as the vector query. The invented answer is never shown to anyone and never stored — it exists only to shape the search.

When to change it. Enable for abstract or explanatory questions, where question and answer share few words. It costs a real LLM call on every recall, so it is the most expensive technique here — the first thing to disable if recall latency matters more than recall depth.

Managing it. Needs a working model; leave recall_hyde_model empty to follow the Fast Utility role rather than pinning one. Keep recall_hyde_max_tokens small (~150) — you need the shape of an answer, not a good one.

recall_enable_query_expansion

Rewrite the question a few ways before searching, so phrasing matters less.

Default: true · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. A pre-search step that generates alternative phrasings of the query and searches with all of them, so a stored fact worded differently from the question still surfaces.

How it works. The query is transformed into up to recall_expansion_max_variants variants — “When is my birthday?” also becomes “birthday is”, “born on” — each is searched, and the results are merged and deduplicated.

When to change it. Worth keeping on. Stored facts are declarative (“her birthday is in March”) while questions are interrogative; the mismatch is the single most common reason a fact that exists fails to come back. Costs one extra search per variant.

Managing it. Raise recall_expansion_max_variants only if recall is visibly missing rephrased facts — each variant is another search, and the return falls off quickly past 3.

recall_enable_self_query

Pull filters out of the question — dates, names — and search within them.

Default: false · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. A step that reads structured constraints out of natural language, so “what did we decide last week” becomes a search restricted to last week rather than a text search containing the words “last week”.

How it works. A small model (recall_self_query_model) extracts filters — time ranges, entity names, keywords — at recall_self_query_temperature, capped at recall_self_query_max_tokens. Extracted filters narrow the candidate set before ranking.

When to change it. Enable when questions carry real constraints — time-bounded, person-scoped, project-scoped. Without it, “last week” is just two more tokens to match and the agent happily returns something from March. Like HyDE it costs an LLM call.

Managing it. Keep temperature low (0.2) — this is extraction, not writing; creativity here means invented filters that silently exclude the right answer.

recall_entity_graph_depth

How many relationship hops out from a matched entity to gather facts.

Default: 1 · Range: 1 to 5, hops · Found in: Memory → Recall · Set via: /api/memory/recall-settings · Advanced — behind the disclosure in Settings.

What it is. The traversal radius in the entity graph. Depth 1 means the entity’s own facts; depth 2 also means facts about everything it is directly related to.

How it works. Facts are collected breadth-first from each matched entity out to this many hops. Because real graphs are densely connected, each additional hop multiplies rather than adds to the set.

When to change it. Keep it at 1 unless you have a specific reason. Depth 2 answers genuinely relational questions (“who else works on what she works on”) and is the point where recall starts pulling in loosely-connected noise. Depth 3+ is rarely useful and reliably slow.

Managing it. The most expensive dial in this section. If recall gets vague after raising it, that is the cause — lower it before adjusting anything else.

recall_entity_max_entities

How many entities one query may pull facts from.

Default: 5 · Range: 1 to 20, entities · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. A ceiling on entity fan-out per recall.

How it works. Matched entities are ranked by similarity and the top N are used. Everything below the cut is ignored regardless of score.

When to change it. Raise it for questions that legitimately span many things (“how do our services talk to each other”). Lower it to keep recall tight and the prompt focused — each extra entity brings its whole fact set.

Managing it. Interacts multiplicatively with recall_entity_graph_depth: 5 entities at depth 2 is a much wider sweep than the numbers suggest. Prefer raising this over raising depth.

recall_entity_similarity_threshold

How confident the match must be before a query is linked to a known entity.

Default: 0.65 · Range: 0.3 to 0.95 · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The minimum similarity for text in the query to be treated as naming an entity.

How it works. Query terms are compared against known entity names; anything at or above this score is treated as a reference to that entity and its facts are pulled in.

When to change it. Raise it (towards 0.9) when the agent drags in facts about the wrong “Alex” or the wrong project — that is a threshold set too low. Lower it (towards 0.5) when entities are referred to loosely, by nickname or abbreviation, and are being missed.

Managing it. The first dial to reach for on entity-recall problems, ahead of recall_entity_max_entities or graph depth. Below ~0.5 nearly everything matches something and the technique stops discriminating.

recall_expansion_max_variants

How many alternative phrasings of the question to search with.

Default: 3 · Range: 1 to 10, variants · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The cap on generated query variants per recall.

How it works. Each variant is searched separately and the results are merged and deduplicated.

When to change it. Raise it when facts are stored in wording consistently unlike how they’re asked about. Lower it to cut per-turn search cost. Returns diminish quickly — the third variant rarely finds what the first two missed.

Managing it. Every variant is another full search, so this multiplies retrieval cost directly. Inert unless recall_enable_query_expansion is on.

recall_first_person_guard

Penalise facts whose subject is ambiguous between the user and the agent.

Default: false · Found in: Memory → Recall · Set via: /api/memory/recall-settings · Experimental — unproven; may change or be withdrawn.

What it is. An experimental attribution guard. It down-weights facts where “I” or “my” makes it unclear whether the statement is about the user or about the agent itself.

How it works. Candidates with ambiguous first-person attribution have their score reduced by recall_first_person_penalty before ranking.

When to change it. Off by default, and it should stay off unless you are specifically investigating attribution errors. It failed its abstention gate in evaluation — it suppressed correctly-attributed facts alongside ambiguous ones. See Memory-Roadmap §2.11.

Managing it. Experimental. Turning it on will change recall in ways the golden set does not model, so re-run eval_recall before and after and compare rather than trusting the feel.

recall_first_person_penalty

How hard the attribution guard penalises an ambiguous fact.

Default: 0.5 · Range: 0 to 1 · Found in: Memory → Recall · Set via: /api/memory/recall-settings · Experimental — unproven; may change or be withdrawn.

What it is. The score reduction applied to first-person-ambiguous candidates.

How it works. Subtracted from the candidate’s score before ranking; 1.0 is effectively exclusion.

When to change it. Only meaningful with recall_first_person_guard on. Lower values de-prioritise ambiguous facts while keeping them reachable; higher values remove them from consideration entirely.

Managing it. Inert while the guard is off. Given the guard’s evaluation history, prefer a gentle value (~0.3) over exclusion if you enable it at all.

recall_hybrid_bm25_weight

How much keyword matching counts when fusing the two searches.

Default: 0.3 · Range: 0 to 1 · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The weight given to the BM25 (exact-token) ranking during fusion.

How it works. Scales BM25’s contribution to each candidate’s fused score before ranking.

When to change it. Raise it when the memory is full of identifiers, error strings, code, or proper nouns — text where the exact token is the signal. Lower it for conversational memory, where the same idea is worded differently every time.

Managing it. Read together with recall_hybrid_vector_weight; the two are usually kept summing to 1.0 (default 0.3 / 0.7, favouring meaning over tokens). Nothing enforces that sum — it is a convention that keeps the numbers interpretable.

recall_hybrid_rrf_k

How sharply top ranks are favoured when merging the two result lists.

Default: 60 · Range: 1 to 200 · Found in: Memory → Recall · Set via: /api/memory/recall-settings · Advanced — behind the disclosure in Settings.

What it is. The Reciprocal Rank Fusion constant. Each list contributes 1/(k + rank), so k sets how steeply the reward falls off with position.

How it works. Low k makes first place worth far more than third — fusion becomes winner-take-all. High k flattens the curve, so agreement across both lists matters more than being first in either.

When to change it. Rarely worth touching; 60 is the value the RRF literature settled on and what the defaults were tuned against. Lower it only if you want one strong signal to dominate; raise it to reward consensus.

Managing it. Applies only when recall_enable_hybrid is on. Change it one step at a time and re-run eval_recall — the effect is real but not intuitive from the number alone.

recall_hybrid_vector_weight

How much semantic similarity counts when fusing the two searches.

Default: 0.7 · Range: 0 to 1 · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The weight given to the vector (meaning) ranking during fusion.

How it works. Scales the vector ranking’s contribution to each candidate’s fused score.

When to change it. The default 0.7 favours meaning, which suits conversational memory where paraphrase is the norm. Lower it if the agent returns thematically-related but factually wrong material — that is vector search over-reaching.

Managing it. Counterpart to recall_hybrid_bm25_weight; conventionally the two sum to 1.0.

recall_hyde_max_tokens

Length cap on the hypothetical answer.

Default: 150 · Range: 50 to 2000, tokens · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The token ceiling for the drafted answer before it is embedded.

How it works. Generation stops here. Because the text is embedded as a whole, a longer draft dilutes the query’s focus as much as it enriches it.

When to change it. 150 is the sweet spot: enough for a couple of sentences with the right shape and vocabulary. Raise it only for genuinely multi-part questions. Larger drafts cost more latency on every single recall and typically retrieve worse.

Managing it. If you find yourself raising this a lot, the real problem is usually a query that should have been split, not a draft that should be longer.

recall_hyde_model

The model that drafts the hypothetical answer. Empty follows the Fast Utility role.

Default: inherit · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The small, fast model used to invent a plausible answer for HyDE to search with. Never writes anything the user sees.

How it works. Called once per recall when HyDE is enabled. Left empty, it follows the Fast Utility model role, so changing that role updates this and every other utility call at once.

When to change it. Pin a model only when you need this specific step to differ from every other utility call. Quality matters far less than usual here — the draft is thrown away after embedding, so pick the cheapest, fastest thing that writes a coherent sentence.

Managing it. Prefer leaving it empty and setting the Fast Utility role instead. A slow model here is felt on every recall, not just hard ones.

recall_hyde_temperature

How varied the hypothetical answer is allowed to be.

Default: 0.7 · Range: 0 to 1 · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. Sampling temperature for the HyDE draft.

How it works. Higher values produce more varied drafts, which move the embedded query further afield.

When to change it. The default 0.7 is deliberately loose — some variation helps the draft land near differently-worded real answers. Lower it towards 0.2 if HyDE is dragging in off-topic material; raise it if it keeps producing the same narrow phrasing and missing paraphrased facts.

Managing it. Only affects retrieval. It can never affect what the agent actually says.

recall_min_confidence

The score a fact must reach before it may enter the prompt at all.

Default: 0.5 · Range: 0 to 1 · Found in: Memory → Recall · Set via: /api/memory/recall-settings · Advanced — behind the disclosure in Settings.

What it is. A floor applied after all techniques and reranking have run. Anything below it is dropped rather than ranked.

How it works. Final scores are compared against this value; failures are discarded before top-k.

When to change it. Raise it when the agent cites weakly-related memories — a hard floor is more predictable than tuning individual techniques. Lower it when you know a fact is stored and it still never appears. Set too high, recall goes silent and the agent looks amnesiac.

Managing it. Applies across every technique, so it is the bluntest instrument here. Move it in 0.05 steps and re-run eval_recall; large jumps make retrieval hard to reason about.

recall_self_query_max_tokens

Length cap on the extracted filter set.

Default: 200 · Range: 50 to 2000, tokens · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The token ceiling for the structured filter output.

How it works. Generation stops here; a truncated filter set is discarded rather than half-applied.

When to change it. 200 comfortably fits a normal filter set. Raise it only if you see extraction being cut off on complex multi-constraint questions.

Managing it. Rarely the cause of a recall problem. Check the model and temperature first.

recall_self_query_model

The model that extracts filters from the question. Empty follows the Fast Utility role.

Default: inherit · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. The small model that reads dates, names, and keywords out of natural language.

How it works. Called once per recall when self-query is enabled, and asked for structured output. Left empty, it follows the Fast Utility model role.

When to change it. Pin one only if the role’s model is unreliable at structured extraction. This is a parsing job, not a reasoning job — a capable small model is the right choice.

Managing it. Prefer leaving it empty and setting the Fast Utility role. A model that returns malformed filters degrades quietly: recall simply proceeds unfiltered.

recall_self_query_temperature

How deterministic filter extraction is. Keep it low.

Default: 0.2 · Range: 0 to 1 · Found in: Memory → Recall · Set via: /api/memory/recall-settings

What it is. Sampling temperature for the extraction call.

How it works. Low values make the same question yield the same filters every time.

When to change it. 0.2 is right, and there is little reason to raise it. Creativity in extraction means invented constraints — a date range nobody asked for — which silently excludes the correct answer and looks like a memory failure.

Managing it. If self-query produces odd filters, lower this before changing the model.

Full catalogue

Every remaining setting, by the screen it appears on. A blank write route means the value is read-only over the API.

Intelligence → Agent Teams

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| alloy.allow_adhoc_delegation | bool | true | config | /api/config/update |

| alloy.chain_of_command | bool | true | config | /api/config/update |

| alloy.delegation_timeout_seconds | int | 300 | config | /api/config/update |

| alloy.effort_tiers.deep | int | 60 | config | read-only |

| alloy.effort_tiers.marathon | int | 100 | config | read-only |

| alloy.effort_tiers.quick | int | 8 | config | read-only |

| alloy.effort_tiers.standard | int | 30 | config | read-only |

| alloy.max_delegation_depth | int | 3 | config | /api/config/update |

| alloy.max_parallel_delegations | int | 3 | config | /api/config/update |

| alloy.non_blocking_delegations | bool | true | config | /api/config/update |

Intelligence → Ambassador

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| ambassador.aide.cache_ttl_seconds | int | 1800 | config | /api/config/update |

| ambassador.aide.enabled | bool | true | config | /api/config/update |

| ambassador.aide.max_input_chars | int | 6000 | config | /api/config/update |

| ambassador.aide.max_parallel | int | 4 | config | /api/config/update |

| ambassador.aide.max_per_survey | int | 8 | config | /api/config/update |

| ambassador.aide.max_tokens | int | 220 | config | /api/config/update |

| ambassador.aide.model | str | (empty) | config | /api/config/update |

| ambassador.aide.temperature | float | 0.2 | config | /api/config/update |

| ambassador.aide.timeout_seconds | int | 20 | config | /api/config/update |

| ambassador.dispatch.enabled | bool | true | config | /api/config/update |

| ambassador.enabled | bool | true | config | /api/config/update |

| ambassador.max_context_turns | int | 8 | config | /api/config/update |

| ambassador.max_tokens | int | 600 | config | /api/config/update |

| ambassador.model | NoneType | — | config | /api/config/update |

| ambassador.profile_id | NoneType | — | config | /api/config/update |

| ambassador.speech_model | NoneType | — | config | /api/config/update |

| ambassador.transcription_model | NoneType | — | config | /api/config/update |

| ambassador.voice | NoneType | — | config | /api/config/update |

Memory → Conversation Context

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| compression.enabled | bool | true | config | /api/config/update |

| compression.max_summary_chars | int | 2000 | config | /api/config/update |

| compression.max_tokens | int | 1000 | config | read-only |

| compression.model | str | (empty) | config | /api/config/update |

| compression.temperature | float | 0.2 | config | read-only |

| context.conversation_state_compaction_enabled | bool | true | config | /api/config/update |

| context.conversation_state_enabled | bool | true | config | /api/config/update |

| context.max_input_tokens | int | 0 | config | /api/config/update |

| context.preassembly_summary_enabled | bool | true | config | /api/config/update |

| context.recent_floor | int | 4 | config | /api/config/update |

| context.rehydrate_max_turns | int | 400 | config | /api/config/update |

| context.summary_trigger_ratio | float | 0.85 | config | /api/config/update |

| context.verbatim_budget_ratio | float | 0.9 | config | /api/config/update |

| memory.episodic_leads_enabled | bool | true | config | /api/config/update |

| session.rolling_summary.enabled | bool | true | config | /api/config/update |

| session.rolling_summary.max_tokens | int | 800 | config | /api/config/update |

| session.rolling_summary.model | str | (empty) | config | /api/config/update |

| trajectory_compression.enabled | bool | true | config | /api/config/update |

| trajectory_compression.max_knowledge_chars | int | 3000 | config | /api/config/update |

| trajectory_compression.max_tokens | int | 1500 | config | read-only |

| trajectory_compression.model | str | (empty) | config | /api/config/update |

| trajectory_compression.preserve_recent_rounds | int | 2 | config | /api/config/update |

| trajectory_compression.temperature | float | 0.2 | config | read-only |

| trajectory_compression.threshold_ratio | float | 0.75 | config | /api/config/update |

Infrastructure → Images & Audio

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| images.avatar_model | str | openrouter:microsoft/mai-image-2.5 | config | /api/config/update |

| images.avatar_style_prompt | str | `Create one square avatar portrait.

COMPOSITI…| config |/api/config/update` |

| images.default_model | str | openrouter:black-forest-labs/flux.2-klein-4b | config | /api/config/update |

| images.enabled | bool | true | config | /api/config/update |

| vision.enabled | bool | true | config | /api/config/update |

| vision.refeed_recent_turns | int | 2 | config | /api/config/update |

Memory → Consolidation

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| combined_extraction_max_tokens | int | 2000 | memory | /api/memory/settings |

| combined_extraction_model | str | inherit | memory | /api/memory/settings |

| combined_extraction_temperature | float | 0.3 | memory | /api/memory/settings |

| contradiction_detection_enabled | bool | true | memory | /api/memory/settings |

| contradiction_max_candidates | int | 10 | memory | /api/memory/settings |

| contradiction_max_tokens | int | 500 | memory | /api/memory/settings |

| contradiction_model | str | inherit | memory | /api/memory/settings |

| contradiction_similarity_threshold | float | 0.5 | memory | /api/memory/settings |

| contradiction_temperature | float | 0.2 | memory | /api/memory/settings |

| correction_detection_enabled | bool | true | memory | /api/memory/settings |

| correction_max_tokens | int | 500 | memory | /api/memory/settings |

| correction_model | str | inherit | memory | /api/memory/settings |

| correction_temperature | float | 0.2 | memory | /api/memory/settings |

| entity_linking_enabled | bool | true | memory | /api/memory/settings |

| entity_linking_max_facts | int | 5000 | memory | /api/memory/settings |

| entity_linking_max_ngram | int | 4 | memory | /api/memory/settings |

| entity_linking_model | str | inherit | memory | /api/memory/settings |

| entity_linking_similarity_threshold | float | 0.75 | memory | /api/memory/settings |

| entity_linking_use_llm_disambiguation | bool | false | memory | /api/memory/settings |

| extraction_condense_facts | bool | true | memory | /api/memory/settings |

| extraction_enabled | bool | true | memory | /api/memory/settings |

| extraction_max_tokens | int | 2000 | memory | /api/memory/settings |

| extraction_model | str | inherit | memory | /api/memory/settings |

| extraction_system_prompt | str | (empty) | memory | /api/memory/settings |

| extraction_temperature | float | 0.2 | memory | /api/memory/settings |

| fact_confidence_threshold | float | 0.7 | memory | /api/memory/settings |

| feature_default_model | str | (empty) | memory | /api/memory/settings |

| job_consolidate_interval | int | 15 | memory | /api/memory/settings |

| job_distill_procedures_interval | int | 30 | memory | /api/memory/settings |

| job_entity_linking_interval | int | 30 | memory | /api/memory/settings |

| job_promote_interval | int | 60 | memory | /api/memory/settings |

| link_autocreate_stub_entities | bool | true | memory | /api/memory/settings |

| procedural_dedupe_threshold | float | 0.85 | memory | /api/memory/settings |

| procedural_distill_batch_limit | int | 100 | memory | /api/memory/settings |

| procedural_distill_max_tokens | int | 1000 | memory | /api/memory/settings |

| procedural_distill_model | str | inherit | memory | /api/memory/settings |

| procedural_distill_temperature | float | 0.2 | memory | /api/memory/settings |

| procedural_distill_timeout_s | int | 90 | memory | /api/memory/settings |

| promotion_min_confidence | float | 0.85 | memory | /api/memory/settings |

| reflex_core_enabled | bool | true | memory | /api/memory/settings |

| reflex_core_limit | int | 5 | memory | /api/memory/settings |

| relevance_filter_enabled | bool | true | memory | /api/memory/settings |

| relevance_filter_max_tokens | int | 500 | memory | /api/memory/settings |

| relevance_filter_model | str | inherit | memory | /api/memory/settings |

| relevance_filter_prompt | str | (empty) | memory | /api/memory/settings |

| relevance_filter_temperature | float | 0.1 | memory | /api/memory/settings |

| salient_core_enabled | bool | true | memory | /api/memory/settings |

| salient_core_limit | int | 8 | memory | /api/memory/settings |

| salient_core_min_salience | float | 0.6 | memory | /api/memory/settings |

| semantic_duplicate_threshold | float | 0.92 | memory | /api/memory/settings |

Memory → Recall

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| cross_encoder_enabled | bool | true | memory | /api/memory/recall-settings |

| cross_encoder_model | str | cross-encoder/ms-marco-MiniLM-L-6-v2 | memory | /api/memory/recall-settings |

| recall_candidate_pool | int | 50 | memory | /api/memory/recall-settings |

| recall_ce_max_demotion | int | 2 | memory | /api/memory/recall-settings |

| recall_enable_entity_centric | bool | true | memory | /api/memory/recall-settings |

| recall_enable_hybrid | bool | true | memory | /api/memory/recall-settings |

| recall_enable_hyde | bool | false | memory | /api/memory/recall-settings |

| recall_enable_query_expansion | bool | true | memory | /api/memory/recall-settings |

| recall_enable_self_query | bool | false | memory | /api/memory/recall-settings |

| recall_entity_graph_depth | int | 1 | memory | /api/memory/recall-settings |

| recall_entity_max_entities | int | 5 | memory | /api/memory/recall-settings |

| recall_entity_similarity_threshold | float | 0.65 | memory | /api/memory/recall-settings |

| recall_expansion_max_variants | int | 3 | memory | /api/memory/recall-settings |

| recall_first_person_guard | bool | false | memory | /api/memory/recall-settings |

| recall_first_person_penalty | float | 0.5 | memory | /api/memory/recall-settings |

| recall_hybrid_bm25_weight | float | 0.3 | memory | /api/memory/recall-settings |

| recall_hybrid_rrf_k | int | 60 | memory | /api/memory/recall-settings |

| recall_hybrid_vector_weight | float | 0.7 | memory | /api/memory/recall-settings |

| recall_hyde_max_tokens | int | 150 | memory | /api/memory/recall-settings |

| recall_hyde_model | str | inherit | memory | /api/memory/recall-settings |

| recall_hyde_temperature | float | 0.7 | memory | /api/memory/recall-settings |

| recall_min_confidence | float | 0.5 | memory | /api/memory/recall-settings |

| recall_self_query_max_tokens | int | 200 | memory | /api/memory/recall-settings |

| recall_self_query_model | str | inherit | memory | /api/memory/recall-settings |

| recall_self_query_temperature | float | 0.2 | memory | /api/memory/recall-settings |

Infrastructure → Model Roles

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| models.defaults.chat | NoneType | — | config | read-only |

| models.defaults.extraction | NoneType | — | config | read-only |

| models.defaults.reasoning | NoneType | — | config | read-only |

| models.fallback_enabled | bool | true | config | read-only |

| models.overrides | dict | (empty) | config | read-only |

| models.roles.deep_reasoning | str | (empty) | config | /api/config/update |

| models.roles.fast_utility | str | (empty) | config | /api/config/update |

| models.roles.summarizer | str | (empty) | config | /api/config/update |

Infrastructure → Model Limits

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| context_limits.lmstudio.context_window | int | 32768 | config | /api/config/update |

| context_limits.lmstudio.max_output_tokens | int | 8192 | config | /api/config/update |

| context_limits.models | dict | (empty) | config | /api/config/update |

| llm_settings.default_max_tokens | int | 4096 | config | /api/config/update |

| llm_settings.default_temperature | float | 0.7 | config | /api/config/update |

| llm_settings.frequency_penalty | float | 0.0 | config | /api/config/update |

| llm_settings.presence_penalty | float | 0.0 | config | /api/config/update |

| llm_settings.top_p | float | 1.0 | config | /api/config/update |

Intelligence → Task Planner

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| planner.complexity_threshold | str | complex | config | /api/config/update |

| planner.enabled | bool | true | config | /api/config/update |

| planner.max_subtasks | int | 6 | config | /api/config/update |

| planner.max_tokens | int | 1000 | config | /api/config/update |

| planner.model | NoneType | — | config | /api/config/update |

| planner.prompt_override | str | (empty) | config | /api/config/update |

| planner.temperature | float | 0.3 | config | /api/config/update |

Prompts → Prompt Enhancement

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| prompt_enhancement.enabled | bool | true | config | /api/config/update |

| prompt_enhancement.max_tokens | int | 1000 | config | /api/config/update |

| prompt_enhancement.model | str | (empty) | config | /api/config/update |

| prompt_enhancement.system_prompt | str | (empty) | config | /api/config/update |

| prompt_enhancement.temperature | float | 0.7 | config | /api/config/update |

Infrastructure → Model Providers

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| providers.anthropic.api_key | NoneType | (secret) | config | /api/config/update |

| providers.anthropic.base_url | NoneType | — | config | /api/config/update |

| providers.custom | dict | (empty) | config | /api/config/update |

| providers.lmstudio.base_url | NoneType | — | config | /api/config/update |

| providers.lmstudio.timeout | int | 300 | config | /api/config/update |

| providers.openai.api_key | NoneType | (secret) | config | /api/config/update |

| providers.openai.base_url | NoneType | — | config | /api/config/update |

| providers.openrouter.api_key | NoneType | (secret) | config | /api/config/update |

| providers.openrouter.app_name | NoneType | — | config | /api/config/update |

| providers.openrouter.site_url | NoneType | — | config | /api/config/update |

| providers.vercel.api_key | NoneType | (secret) | config | /api/config/update |

| providers.vercel.base_url | NoneType | — | config | /api/config/update |

Intelligence → Research Mode

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| research.default_depth | str | auto | config | /api/config/update |

| research.enabled | bool | true | config | /api/config/update |

| research.max_tool_rounds | int | 40 | config | /api/config/update |

| research.min_max_tokens | int | 16384 | config | /api/config/update |

| web_research.budget_weight | int | 3 | config | /api/config/update |

| web_research.cache_ttl_seconds | int | 1800 | config | /api/config/update |

| web_research.enabled | bool | true | config | /api/config/update |

| web_research.poll_interval_seconds | int | 5 | config | /api/config/update |

| web_research.poll_timeout_seconds | int | 240 | config | /api/config/update |

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| search.backend | str | tavily | config | /api/config/update |

| search.brave_answers_cost_per_request_usd | float | 0.004 | config | read-only |

| search.brave_answers_enabled | bool | false | config | /api/config/update |

| search.brave_api_key | NoneType | (secret) | config | /api/config/update |

| search.brave_context_max_snippets | int | 50 | config | read-only |

| search.brave_context_max_tokens | int | 4096 | config | /api/config/update |

| search.brave_context_max_tokens_per_url | int | 1024 | config | /api/config/update |

| search.brave_context_threshold | str | balanced | config | /api/config/update |

| search.brave_cost_per_request_usd | float | 0.005 | config | read-only |

| search.brave_grounding_default | bool | true | config | /api/config/update |

| search.brave_research_tiers.auto.iterations | int | 3 | config | read-only |

| search.brave_research_tiers.auto.queries | int | 20 | config | read-only |

| search.brave_research_tiers.auto.seconds | int | 180 | config | read-only |

| search.brave_research_tiers.mini.iterations | int | 2 | config | read-only |

| search.brave_research_tiers.mini.queries | int | 8 | config | read-only |

| search.brave_research_tiers.mini.seconds | int | 90 | config | read-only |

| search.brave_research_tiers.pro.iterations | int | 5 | config | read-only |

| search.brave_research_tiers.pro.queries | int | 40 | config | read-only |

| search.brave_research_tiers.pro.seconds | int | 300 | config | read-only |

| search.cache_ttl_seconds | int | 300 | config | /api/config/update |

| search.cost_per_credit_usd | float | 0.008 | config | read-only |

| search.country | str | (empty) | config | /api/config/update |

| search.default_chunks_per_source | int | 0 | config | /api/config/update |

| search.default_search_depth | str | (empty) | config | /api/config/update |

| search.fallback_enabled | bool | true | config | /api/config/update |

| search.max_results | int | 5 | config | /api/config/update |

| search.per_turn_cost_usd | float | 0.0 | config | /api/config/update |

| search.per_turn_limit | int | 8 | config | /api/config/update |

| search.research_per_turn_cost_usd | float | 0.0 | config | /api/config/update |

| search.research_per_turn_limit | int | 40 | config | /api/config/update |

| search.safesearch | str | (empty) | config | /api/config/update |

| search.search_lang | str | (empty) | config | /api/config/update |

| search.source_policy | dict | (structured) | config | /api/config/update |

| search.tavily_api_key | NoneType | (secret) | config | /api/config/update |

| search.timeout | int | 15 | config | /api/config/update |

Intelligence → Thinking Patterns

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| reasoning.auto_classifier_enabled | bool | true | config | /api/config/update |

| reasoning.chat_patterns_enabled | bool | true | config | /api/config/update |

| reasoning.classifier_min_chars | int | 240 | config | /api/config/update |

| reasoning.classifier_model | str | (empty) | config | /api/config/update |

| reasoning.cot_enabled | bool | true | config | /api/config/update |

| reasoning.min_output_tokens | int | 0 | config | /api/config/update |

| reasoning.reflection_enabled | bool | true | config | /api/config/update |

| reasoning.sc_k | int | 3 | config | /api/config/update |

| reasoning.sc_model | str | (empty) | config | /api/config/update |

| reasoning.self_consistency_enabled | bool | true | config | /api/config/update |

| reasoning.step_back_enabled | bool | true | config | /api/config/update |

| reasoning.step_back_model | str | (empty) | config | /api/config/update |

| reasoning.step_back_timeout_seconds | int | 20 | config | /api/config/update |

Not shown in Settings

| Setting | Type | Default | Store | Set via |

| --- | --- | --- | --- | --- |

| always_include_recent_turns | int | 3 | memory | read-only |

| audit_log_level | str | writes | memory | read-only |

| audit_partition_ahead_days | int | 7 | memory | read-only |

| audit_retention_days | int | 30 | memory | read-only |

| audit_sample_rate | float | 1.0 | memory | read-only |

| channel_active_boost | float | 1.2 | memory | read-only |

| confidence_explicit | float | 0.95 | memory | read-only |

| confidence_implied | float | 0.85 | memory | read-only |

| confidence_inferred | float | 0.7 | memory | read-only |

| confidence_uncertain | float | 0.5 | memory | read-only |

| connection_timeout | int | 5 | memory | read-only |

| default_top_k | int | 10 | memory | read-only |

| embedding_api_key | str | (secret) | memory | read-only |

| embedding_base_url | str | (empty) | memory | read-only |

| embedding_batch_max_size | int | 32 | memory | read-only |

| embedding_batch_window_ms | int | 5 | memory | read-only |

| embedding_cache_enabled | bool | true | memory | read-only |

| embedding_cache_max_size | int | 2048 | memory | read-only |

| embedding_cache_ttl_seconds | float | 900.0 | memory | read-only |

| embedding_dimensions | int | 1024 | memory | read-only |

| embedding_max_retries | int | 3 | memory | read-only |

| embedding_model | str | text-embedding-3-small | memory | read-only |

| embedding_provider | str | local | memory | read-only |

| embedding_queue_enabled | bool | true | memory | read-only |

| embedding_queue_max_size | int | 1024 | memory | read-only |

| embedding_remote_max_inputs | int | 2048 | memory | read-only |

| embedding_request_timeout | float | 30.0 | memory | read-only |

| entity_embedding_backfill_batch | int | 200 | memory | read-only |

| entity_linking_auto_threshold | float | 0.9 | memory | read-only |

| entity_types | list | (structured) | memory | read-only |

| episodic_retention_days | int | 90 | memory | read-only |

| extraction_registry_max_entities | int | 15 | memory | read-only |

| extraction_registry_max_facts | int | 20 | memory | read-only |

| extraction_timeout | float | 30.0 | memory | read-only |

| extraction_window_max_output_tokens | int | 3000 | memory | read-only |

| extraction_window_max_tokens | int | 1200 | memory | read-only |

| extraction_window_max_turns | int | 6 | memory | read-only |

| extraction_windowing_enabled | bool | true | memory | read-only |

| job_audit_partitions_interval | int | 1440 | memory | read-only |

| job_cleanup_interval | int | 1440 | memory | read-only |

| job_decay_interval | int | 1440 | memory | read-only |

| job_patterns_interval | int | 60 | memory | read-only |

| local_embedding_model | str | BAAI/bge-m3 | memory | read-only |

| max_query_length | int | 10000 | memory | read-only |

| max_results_per_conversation | int | 3 | memory | read-only |

| max_working_memory_items | int | 50 | memory | read-only |

| memory.project_channels | bool | true | config | /api/config/update |

| neo4j_max_connection_lifetime | int | 300 | memory | read-only |

| neo4j_password | str | (secret) | memory | read-only |

| neo4j_uri | str | (secret) | memory | read-only |

| neo4j_user | str | neo4j | memory | read-only |

| openai_api_key | str | (secret) | memory | read-only |

| postgres_pool_max_overflow | int | 20 | memory | read-only |

| postgres_pool_size | int | 10 | memory | read-only |

| postgres_uri | str | (secret) | memory | read-only |

| preferences.default_model | NoneType | — | config | /api/config/update |

| preferences.default_reasoning_strategy | str | auto | config | /api/config/update |

| preferences.enable_memory_by_default | bool | true | config | /api/config/update |

| pricing.audio | dict | (empty) | config | read-only |

| pricing.images | dict | (empty) | config | read-only |

| promotion_min_access_count | int | 5 | memory | read-only |

| promotion_min_conversations | int | 2 | memory | read-only |

| redis_uri | str | (secret) | memory | read-only |

| relationship_types | list | (structured) | memory | read-only |

| reranking_enabled | bool | true | memory | read-only |

| retrieval_cache_enabled | bool | true | memory | read-only |

| retrieval_cache_key_prefix | str | (secret) | memory | read-only |

| retrieval_cache_ttl_seconds | int | 60 | memory | read-only |

| retrieval_weight_episodic | float | 0.3 | memory | read-only |

| retrieval_weight_procedural | float | 0.15 | memory | read-only |

| retrieval_weight_recency | float | 0.1 | memory | read-only |

| retrieval_weight_semantic_entities | float | 0.2 | memory | read-only |

| retrieval_weight_semantic_facts | float | 0.25 | memory | read-only |

| salience_decay_rate | float | 0.95 | memory | read-only |

| semantic_entity_linking_enabled | bool | true | memory | read-only |

| shell.allow_network | bool | false | config | read-only |

| shell.allow_unsandboxed | bool | false | config | read-only |

| shell.deny_patterns | list | (empty) | config | read-only |

| shell.docker.cpus | str | 2 | config | read-only |

| shell.docker.enabled | bool | false | config | read-only |

| shell.docker.idle_ttl_days | int | 7 | config | read-only |

| shell.docker.image | str | python:3.14-slim | config | read-only |

| shell.docker.memory | str | 2g | config | read-only |

| shell.docker.network | str | agentx-shell-net | config | read-only |

| shell.docker.pids_limit | int | 512 | config | read-only |

| shell.max_materialize_bytes | int | 134217728 | config | read-only |

| shell.max_output_chars | int | 20000 | config | read-only |

| shell.require_confirmation | bool | false | config | read-only |

| shell.timeout_seconds | int | 20 | config | read-only |

| shell.workdir_cleanup_days | int | 7 | config | read-only |

| user_recap_enabled | bool | true | memory | read-only |

| worker_heartbeat_interval | int | 30 | memory | read-only |

| worker_heartbeat_ttl | int | 90 | memory | read-only |

| workspace_agent_writable_extensions | list | (structured) | memory | read-only |

| workspace_agent_write_tools | bool | true | memory | read-only |

| workspace_allowed_extensions | list | (structured) | memory | read-only |

| workspace_chunk_overlap | int | 150 | memory | read-only |

| workspace_chunk_size | int | 1000 | memory | read-only |

| workspace_max_file_bytes | int | 52428800 | memory | read-only |

| workspace_quota_bytes | int | 536870912 | memory | read-only |

| workspace_summary_model | str | (empty) | memory | read-only |

  • Configuration — environment variables, connector files, and the layout of the config files themselves.