Technical docs

Settings

Overview

Support reference for personal settings at `/settings` and organization settings at `/org-settings`.

Shared settings shell

  • Personal and organization settings use the same full-height, scrollable settings shell.
  • The visible content does not repeat the former large page title and description. A hidden `Settings` heading remains available to assistive technology.
  • Organization settings add a compact, horizontally scrollable route navigation control above the content.

Personal settings

Routes

  • `/settings` is the unified personal settings page.
  • Legacy routes redirect to `/settings`:
  • `/settings/appearance`
  • `/settings/connectedAccounts`

Connected accounts

  • Section title: `Connected accounts`
  • Description: `Manage external accounts linked to your profile.`
  • Accounts shown:
  • `Gmail`
  • `Telegram`
  • Gmail reflects the current Google-linked profile and is display-only on this page.
  • Telegram behavior:
  • an unlinked account shows `Connect`
  • a linked account shows its identifier and `Disconnect`
  • the identifier prefers `@username`, then linked name, then the Telegram account ID
  • disconnect requires confirmation in a `Disconnect Telegram` dialog
  • Connecting Telegram starts with `GET /api/auth/telegram` and redirects to the returned authorization URL.
  • Disconnecting uses `DELETE /api/auth/telegram`, refreshes the current user from the returned payload, and reports `Telegram account disconnected`.

Language

  • Section title: `Language`
  • Description: `Choose interface language.`
  • Choices:
  • `Automatic`
  • `English`
  • `Russian`
  • `Spanish`
  • `Ukrainian`
  • `Serbian`
  • `Kazakh`
  • `Romanian`
  • `Automatic` uses the browser's preferred language and falls back to English when that language is unsupported.

Appearance

  • Theme choices:
  • `Light`
  • `Latte`
  • `Dark`
  • `Dark Blue`
  • `System`
  • Theme selection applies immediately.
  • `Full-width AI responses` controls internal-chat presentation:
  • enabled: AI responses use the full chat width
  • disabled: AI responses use bubbles

Organization settings routes

  • `/org-settings` redirects to `/org-settings/organization`.
  • Navigation items:
  • `Organization`
  • `AI Providers`
  • `Webchat`
  • `AI Providers` and `Webchat` are visible only to org admins, owners, and developer users who pass the org-admin access check. Direct visits by other users render `AccessDenied`.
  • The organization shell no longer contains the interface-language picker. Language is managed on `/settings`.
  • Organization settings tabs share these initial states:
  • centered `Loading` indicator while required data loads
  • `Failed to load data` with `Retry` when initial loading fails
  • `No organization selected` when organization context is unavailable
  • Data loaded for a previous organization is discarded when the active organization changes.

Organization

  • Route: `/org-settings/organization`
  • Main content uses a responsive two-column card layout.

General information

  • Card title: `General Information`
  • Description: `Basic details about your organization`
  • Fields:
  • `Organization`
  • `Base LLM`
  • `Base LLM` lists non-realtime, non-TTS, non-STT text models from the shared model catalog.
  • `Auto` clears the organization default model.
  • The general Save action updates organization name and base model together.
  • An empty organization name cannot be saved.
  • When an AI teammate or Ally has no explicit model, runtime resolution tries the organization base model before the system fallback model.

AI teammate spending limit

  • The separate `AI teammate spending limit` card applies one optional daily model-spending limit independently to every AI teammate.
  • The input uses a `$` prefix and accessible label `Daily limit`.
  • Valid configured values start at `$0.01` and allow at most two decimal places.
  • `Remove daily limit` clears the draft to restore unlimited usage after Save.
  • This card has its own Save action and reports `Daily spending limit updated` or `Failed to update daily spending limit`.
  • Organization owners and admins can edit the limit. Other members see it read-only. Developer access alone does not grant edit permission.
  • Route: `PUT /api/organizations/{organization_id}/ai-employee-daily-cost-limit`
  • Body: `{ ai_employee_daily_cost_limit_usd: number | null }`
  • The allowance resets at `00:00 UTC`. Changing or removing the limit applies immediately to usage accumulated during the current UTC day.

Debug Mode

  • `Debug Mode` is an immediate-save switch.
  • Description: `Enable debug mode for additional logging and diagnostics`
  • Success feedback is `Debug mode enabled` or `Debug mode disabled`.

Lazy Tools

  • `Lazy Tools` is an immediate-save switch.
  • Description: `Load agent tools on demand instead of sending the whole tool list in every request`
  • It defaults to enabled.
  • When enabled, non-eager built-in and assigned MCP/OAuth tools load on demand. When disabled, those tools are exposed directly to the model.
  • Feedback is `Lazy tools enabled`, `Lazy tools disabled`, or `Failed to update lazy tools`.

Auto Compacting

  • `Auto Compacting` is an immediate-save switch backed by `is_auto_compacting_enabled` and defaults to disabled.
  • Description: `Let agents summarise and archive their own conversation history once it outgrows the context window`
  • When enabled, Alloy summarizes older conversation context after runtime limits are crossed while keeping recent messages verbatim. Summarization model usage is recorded as normal attributable usage.
  • If summarization fails, Alloy keeps and sends the original history rather than dropping it.
  • Feedback is `Auto compacting enabled`, `Auto compacting disabled`, or `Failed to update auto compacting`.

Organization Slack connection

  • The `Slack` card manages the organization-wide Slack app used by Personal Ally.
  • Description: `Interact with Ally directly in Slack`
  • All organization members can see current connection information. Connect, reconnect, and disconnect require organization-admin access in both UI and backend.
  • Controls:
  • disconnected: `Connect`
  • invalid: `Reconnect`
  • active: `Disconnect`
  • Active connections can show workspace name and ID, installer identity, and connection date.
  • Disconnect requires entering the exact confirmation text `disconnect`.
  • A successful OAuth callback returns to `/org-settings/organization?slack=connected`, reports `Connected`, and removes callback parameters from the URL.
  • Connection state updates through `organization_channel_connection.updated`.
  • API routes:
  • `GET /api/organizations/{orgId}/slack`
  • `POST /api/organizations/{orgId}/slack/oauth/start`
  • `POST /api/slack/oauth/callback`
  • `DELETE /api/organizations/{orgId}/slack`

Alloy API keys

  • Authorized organization editors see the brand-specific API key card.
  • Rows:
  • `Public`
  • `Private`
  • The public key is displayed and can be copied.
  • The private key remains masked and is fetched only when its copy action is used.

Organization data flow and permissions

  • General and immediate-save settings use `PUT /api/organizations/{id}`.
  • Supported page fields are `name`, `ai_default_model`, `is_debug_mode`, `use_lazy_tools`, and `is_auto_compacting_enabled`.
  • The backend validates a non-null model against the model catalog and requires the lazy-tools and auto-compacting flags to be boolean.
  • General editing is enabled for owners/admins and developer users through the frontend org-admin access helper. The backend independently rejects non-admin organization members.
  • Organization state refreshes through `organization.updated`; reached daily-limit transitions use `ai_employee.updated`.
  • Initial page rendering waits for both the model catalog and Slack connection state. `Retry` reloads both after an initial failure.
  • A later model refetch failure reports `Failed to load AI models` without replacing already loaded settings content.

AI Providers

  • Route: `/org-settings/api-keys`
  • Nav label: `AI Providers`
  • Main layout:
  • `Provider API Keys`
  • `Custom provider`
  • `OpenAI Codex`
  • Initial provider and Codex state is loaded before the cards render. Failure shows `Failed to load data` with `Retry`.

Manual provider keys

  • Provider rows:
  • `OpenAI`
  • `OpenRouter`
  • `Google`
  • `DeepSeek`
  • `Anthropic`
  • Saved keys use a masked prefix/suffix preview and cannot be copied from the UI.
  • Saving or clearing uses `PATCH /api/organizations/{id}/providers/{provider}` with `{ api_key: "<key>" }` or `{ api_key: null }`.
  • Provider rows stay in sync through `organization_ai_provider.updated`.

Custom provider

  • This is an organization-scoped OpenAI-compatible provider.
  • Fields:
  • `API key`
  • `Base URL`
  • The Base URL helper asks for the API root including any required version path and gives an example such as `https://api.example.com/v1`.
  • Both fields are required before Save becomes available.
  • After Save, the key uses a masked preview and the Base URL becomes read-only.
  • `Reset` clears both values. The reset toast offers `Undo` for the current five-minute restore window.

OpenAI Codex

  • States:
  • `Connect`
  • authorization with copyable `Code`, countdown, and `Open authorization page`
  • active connection with `Disconnect` plus a `Details` hover card showing the Codex account `User name`, `Email`, `Connected by`, and `Connected on`
  • `Disconnect` opens a `Disconnect OpenAI Codex?` confirmation dialog before revoking the connection.
  • Connection attempts and provider state update in real time.
  • Routes:
  • `POST /api/organizations/{id}/providers/codex/connection-attempts`
  • `GET /api/organizations/{id}/providers/codex/connection-attempts/current`
  • `POST /api/organizations/{id}/providers/codex/revoke`

Provider runtime behavior

  • Runtime uses a matching active organization provider credential before the system credential for the same provider.
  • Usage with organization credentials is still recorded for usage and cost reporting but does not reduce organization `available_tokens`.
  • The page listens to `organization.updated`, `organization_ai_provider.updated`, and `organization_ai_provider_connection_attempt.updated`.

Webchat

  • Route: `/org-settings/webchat`
  • Initial loading fetches widget settings and the first webchat trigger together.
  • Failure shows `Failed to load data` with `Retry`.
  • Main layout uses a scrollable settings form plus `Live Preview`.
  • Theme choices:
  • `System`
  • `Light`
  • `Dark`
  • `Custom`
  • `System` mode has Light and Dark editing tabs.
  • Color sections:
  • `Minimized widget`: `Bubble color`, `Icon color`
  • `Maximized widget`: `Chat background`, `Primary color`
  • `Message colors`: `Customer bubble color`, `Customer text color`, `Agent bubble color`, `Agent text color`
  • Each color control provides a visual picker, text value, and field-level reset.
  • `Custom` mode exposes `Custom CSS` and warns that it overrides the other settings.
  • Footer actions:
  • `Reset to defaults`
  • `Save changes`
  • Backend values:
  • `mode`: `system`, `light`, `dark`, `custom`
  • `widgetDomain`: `default`, `proxy`
  • API routes:
  • `GET /api/organizations/{id}/settings/webchat-widget-settings`
  • `POST /api/organizations/{id}/settings/webchat-widget-settings`
  • Reset to defaults sends an empty POST body.
  • Defaults can also contain runtime fields not currently editable here: `opacity`, `primaryTextColor`, `secondaryTextColor`, `borderColor`, and `systemMessageColor`.
  • The preview loads the widget script, initializes it with the organization public key and first webchat trigger ID, and destroys it when leaving the page.

Not in these settings shells

  • Models and Voices are separate tools, not `/org-settings/*`.
  • `/defaults` is the separate developer-only system defaults page.

Start building your AI team