Skip to content

Agent ​

Language preferences, active provider + model, reasoning level, the experimental codemode switch, and the user-editable rules the agent follows on every turn.

URL: /settings?tab=agent

Personal agent settings (regular users) ​

Regular users open Settings and see the personal Agent, Heartbeat, Email and Secrets tabs. The Agent tab holds their own:

  • Chat model — any enabled model of any provider.
  • Thinking level — off to max.
  • Language — the agent's reply language and the language speech-to-text transcribes in.
  • Timezone — the timezone of the agent's "now", your daily notes and your cronjobs and reminders (see Timezone).

Each field offers Use default (admin: …). On default, the user follows the admin's global settings below, including later changes by the admin. An override applies from that user's next message and affects nobody else.

The thinking-level button next to the chat input is available to everyone: it changes the user's own level, and the global level for admins. The same applies to /model and /thinking in the web chat and Telegram — see Chat → Slash commands. Regular users can also run /model default and /thinking default to go back to the default.

The remaining settings on this page (rules, provider, codemode, uploads, resilience, …) and all other tabs are admin-only. Admin settings are the global defaults for everyone; admins have no personal layer.

Agent Rules ​

A card at the top of the panel links to /data/config/AGENTS.md — the file the agent reads on every conversation as its "user-editable behavior rules" block.

Click Open editor to jump to the Agent Instructions page, where the file opens in a full-screen Markdown editor with a Restore default button.

See Agent Instructions for what belongs in this file, the default template, and editing tips.

Agent language ​

Forces the agent's reply language. Mapped to the <language> block in the system prompt.

ValueBehavior
matchMirror the user's language on each turn.
English, German, French, Spanish, Italian, Portuguese, Dutch, Russian, Chinese, Japanese, KoreanReply in this language regardless of the user's input.

Applies immediately on the next turn.

json
{ "language": "German" }

Timezone ​

The current date in this timezone is injected into the system prompt, and the minute-level time is appended to each user message, so the agent always knows "now" (the time is kept out of the system prompt to avoid invalidating provider prompt caches every minute — see System Prompt → layer 16). Also used for cron evaluation (Tasks & Heartbeat) and the naming of memory/daily/<date>.md files.

Default: UTC. Mirrors the container's TZ env var if set.

On a multi-user instance this is the global default (the admin's timezone). Every other user can pick their own timezone under Settings → Agent or keep Use default (admin: …). A user's timezone drives:

  • the current date and time the agent sees in that user's chats,
  • the file date and HH:MM headings of that user's daily notes,
  • when that user's cronjobs and reminders fire.

When a user changes their timezone, their enabled cronjobs and reminders are rescheduled immediately. Admins can set a user's language and timezone when creating the account on the Users page.

json
{ "timezone": "Europe/Vienna" }

Provider ​

The active provider + model used for all normal chat conversations. The dropdown shows every enabled model across every configured provider (e.g. ChatGPT Plus (gpt-5.4-mini), Anthropic (claude-sonnet-4), Ollama (qwen2.5-coder)).

Changing this value activates the chosen combination immediately — in-flight sessions will use the new provider on their next turn.

Internally stored as two keys:

json
{
  "activeProviderId": "openai-chatgpt-plus",
  "activeModelId": "gpt-5.4-mini"
}

Configure providers themselves (add new ones, enable/disable models, set API keys) on the Providers page, not here.

Thinking level ​

How hard the main chat agent reasons before replying. Higher levels are slower and more expensive.

The dropdown only offers the levels the active model supports (from the model catalog or the model's Edit Model settings). A model without reasoning only offers off. If the stored level isn't supported by the current model — e.g. after switching models — it is marked not supported and the model runs with the nearest supported level instead (the next higher one first, otherwise the next lower one).

ValueUse for
offPlain chat, no reasoning tokens.
minimalTiny amount of reasoning — default for most people.
lowQuick internal planning.
mediumMulti-step problems.
highHard reasoning, tool-heavy flows.
xhighExtra effort — only models that explicitly support it.
maxMaximum effort — only models that explicitly support it.

This only applies to the interactive chat agent. Background jobs (tasks, heartbeat) have their own setting in Tasks → Background thinking level.

json
{ "thinkingLevel": "minimal" }

Codemode (experimental) ​

Adds the codemode tool to the interactive chat agent on every channel (web UI and Telegram) — a JavaScript script that batches, chains and filters tool calls, so only the script's output reaches the model. Off by default, and the section is marked Experimental in the UI: the feature may change between releases, and script quality depends on the model. Applies from the next turn — no restart needed.

Background task agents have their own switch in Tasks → Codemode.

json
{ "codemode": { "mainAgent": true } }

Upload retention ​

How many days uploaded files in /data/uploads/ are kept before the cleanup job removes them. Applies to images, audio, and any other files users attach from the web UI or Telegram. Default: 30. Set to 0 to have the next cleanup run delete all uploads.

json
{
  "uploads": {
    "retentionDays": 30
  }
}

The cleanup job also prunes the referencing rows in the database so stale upload metadata doesn't linger after the files are gone.

Resilience ​

How the agent reacts when a provider misbehaves mid-turn. All five fields are read at the start of every turn, so a save applies to the next message — no restart needed.

Automatic retry ​

When a turn fails with a transient provider error (429, 5xx, timeout, dropped stream, or a watchdog stall abort), Axiom discards the failed attempt and re-runs the turn from the existing transcript — the user message is never sent twice. Errors the provider won't recover from on its own (invalid API key, quota, billing) fail immediately, and a turn you stop yourself is never retried.

FieldDefaultRangeEffect
Automatic retryon—Master switch. Off means every provider error ends the turn immediately.
Maximum retries30 – 10Retry budget per turn. 0 behaves like the switch being off.
Base delay2000 ms100 – 60000 msBackoff base; attempt n waits base × 2^(n-1) — with the defaults 2s / 4s / 8s.

While a retry is pending the chat shows a Retrying (n/max)… status. Once the budget is exhausted, the turn ends with a persisted error message containing the provider's error text.

json
{
  "retry": { "enabled": true, "maxRetries": 3, "baseDelayMs": 2000 }
}

Stall thresholds ​

The watchdog measures how long a turn goes without a single chunk from the provider. At the warn threshold a provider_stall message is written to the chat (it survives a reload and is updated in place when the provider recovers); at the abort threshold the stream is hard-aborted, which counts as a retryable error. Time spent executing tool calls (shell commands, image generation, …) does not count — the clock only runs while Axiom is waiting for the provider.

FieldDefaultRange
Stall warning threshold30000 ms1000 – 600000 ms
Stall abort threshold90000 ms1000 – 3600000 ms, must be ≥ the warning threshold
json
{
  "watchdog": { "stallWarnMs": 30000, "stallAbortMs": 90000 }
}

Stall frequency and average duration (split by recovered vs. aborted) are aggregated on the Token Usage page. Telegram delivery of the warning is opt-in — see Telegram → Send stall warnings.

Context compaction ​

When a chat approaches the model's context window, older messages are replaced by a summary and the most recent messages are kept verbatim. All thresholds derive from the active model's context window — there are no budgets to set. How this works — triggers, the summary format, the per-window caps — is explained in Context Compaction. The switch is read fresh before every check, so a save applies without a restart.

FieldDefaultEffect
Automatic compactiononMaster switch for automatic compaction (main chat and tasks). /compact works even when off.

Whether background tasks are compacted too is switched under Tasks → Context compaction.

json
{ "compaction": { "enabled": true } }

Released under the MIT License.