Admin Settings
Manage runtime application configuration through the Admin Settings UI without restarting the application.
Overview
Section titled “Overview”Admin Settings provides:
- Runtime Configuration - Change settings without redeploying or restarting
- LLM Provider Management - Configure and hot-swap AI providers at runtime
- Change History - Full audit trail of all setting changes with user attribution
- Encrypted Storage - Sensitive values (API keys, endpoints) encrypted in the database
- Role-Restricted - Only Admin users can access settings
Accessing Admin Settings
Section titled “Accessing Admin Settings”- Log in as an Admin user
- Navigate to Admin Settings in the navigation menu (
/admin-settings) - Configure settings across the available tabs
Configuration Tabs
Section titled “Configuration Tabs”General Settings
Section titled “General Settings”| Setting | Description | Example |
|---|---|---|
| Base URL | Application URL for notification links | https://yourdomain.com |
The Base URL is used to generate clickable links in Teams/Slack notifications that take users to the Beacon UI (the React app is served at the root URL).
AI Configuration
Section titled “AI Configuration”Configure the LLM provider for AI-powered features (documentation generation, natural language alerts).
| Setting | Description | Required |
|---|---|---|
| Provider | LLM provider (OpenAI, Anthropic, AzureOpenAI, Bedrock) | Yes |
| API Key | Authentication key for the provider | Yes |
| Endpoint | Custom API endpoint URL | No |
| Region | AWS region (Bedrock only) | Bedrock only |
| Model | Primary model name | Yes |
| Fast Model | Lightweight model for quick operations | No |
| Max Concurrent Requests | Parallel request limit | No (default: 50) |
| Tokens Per Minute | Rate limit | No (default: 80,000) |
| Requests Per Minute | Rate limit | No (default: 1,000) |
| Monthly Budget | Cost cap in USD | No (default: $100) |
Change History
Section titled “Change History”View a complete audit log of all settings changes:
- Setting Key - Which setting was changed
- Old Value / New Value - Previous and new values (masked for sensitive fields)
- Changed By - User who made the change
- Changed At - Timestamp
Hot-Swap LLM Providers
Section titled “Hot-Swap LLM Providers”Admin Settings can change the LLM provider at runtime without restarting the application.
How It Works
Section titled “How It Works”- Admin updates LLM settings via the UI
AppSettingsServicesaves encrypted values to the databaseLlmProviderManagerreceives the update viaILlmConfigurationUpdater- A new provider instance is created with the updated configuration
DelegatingLlmProvider(the proxy injected throughout the app) automatically delegates to the new provider- All subsequent AI requests use the new provider immediately
Architecture
Section titled “Architecture”AppSettingsService.SaveSettingsAsync() │ ├── Save to database (encrypted) ├── Invalidate cache ├── Update BeaconConfiguration singleton │ └── ILlmConfigurationUpdater.UpdateConfiguration() │ └── LlmProviderManager ├── Mutate LlmConfiguration singleton └── Recreate ILlmProvider via factory │ └── DelegatingLlmProvider (proxy) └── All consumers use new providerExample: Switching from OpenAI to Anthropic
Section titled “Example: Switching from OpenAI to Anthropic”- Go to Admin Settings > AI Configuration
- Change Provider to
Anthropic - Update API Key to your Anthropic key
- Change Model to
claude-3-5-sonnet-20241022 - Click Save
- AI features immediately use Anthropic — no restart needed
Initial Configuration
Section titled “Initial Configuration”Settings can be pre-configured in two ways.
Via appsettings.json (Startup Defaults)
Section titled “Via appsettings.json (Startup Defaults)”{ "Beacon": { "BaseUrl": "https://yourdomain.com", "LLM": { "Provider": "OpenAI", "ApiKey": "sk-your-api-key", "Model": "gpt-4o" } }}On startup, if Admin Settings in the database are empty, values from appsettings.json are used as defaults. Once saved via the Admin Settings UI, database values take precedence.
Via First-Run Setup
Section titled “Via First-Run Setup”After creating the super admin during first-run setup, navigate to Admin Settings to configure the LLM provider and other settings.
Database Storage
Section titled “Database Storage”Settings are stored in two tables.
app_settings
Section titled “app_settings”| Column | Type | Description |
|---|---|---|
key | string | Setting identifier (e.g., LLM.ApiKey) |
value | string? | Setting value (encrypted if sensitive) |
category | string | Grouping (General, LLM) |
is_sensitive | bool | If true, value is encrypted |
app_setting_history
Section titled “app_setting_history”| Column | Type | Description |
|---|---|---|
setting_key | string | Which setting changed |
old_value | string? | Previous value (*** if sensitive) |
new_value | string? | New value (*** if sensitive) |
changed_at | DateTime | When the change occurred |
changed_by_user_id | string? | Who made the change |
Programmatic Access
Section titled “Programmatic Access”Reading Settings
Section titled “Reading Settings”public class MyService{ private readonly IAppSettingsService _settingsService;
public MyService(IAppSettingsService settingsService) { _settingsService = settingsService; }
public async Task DoSomethingAsync() { var settings = await _settingsService.GetSettingsAsync();
var baseUrl = settings.BaseUrl; var llmProvider = settings.LlmProvider; var llmModel = settings.LlmModel; }}Saving Settings
Section titled “Saving Settings”var settings = await _settingsService.GetSettingsAsync();settings.BaseUrl = "https://new-domain.com";
await _settingsService.SaveSettingsAsync(settings, userId: currentUser.Id);Viewing History
Section titled “Viewing History”var history = await _settingsService.GetHistoryAsync();
// Filter by setting keyvar llmHistory = await _settingsService.GetHistoryAsync(key: "LLM.ApiKey");Implementing ILlmConfigurationUpdater
Section titled “Implementing ILlmConfigurationUpdater”If you build custom services that need to react to LLM configuration changes, implement ILlmConfigurationUpdater:
public interface ILlmConfigurationUpdater{ void UpdateConfiguration(AppSettingsData settings);}This interface lives in Beacon.Core so that AppSettingsService can call it without depending on Beacon.AI. The implementation (LlmProviderManager) lives in the AI project.
Caching
Section titled “Caching”Settings are cached in memory for 1 hour to minimize database queries. The cache is invalidated immediately when settings are saved via the Admin Settings UI.
MCP Settings
Section titled “MCP Settings”MCP server behavior has its own admin page at /mcp-settings, organised into four tabs — Pre-prompt (SQL-generation system prompt, global instruction), Tool descriptions (overrides applied to the live tools/list response), Guardrails (max row limit, read-only enforcement, PII detection with custom patterns, and the learning knobs), and Context preview (see the grounding context for a project exactly as the tools assemble it).
See the MCP Server Guide for details. Additional retrieval, exemplar, and eval settings that aren’t on this page are settable through PUT /beacon/api/mcp/settings — see the Knowledge Base guide. Like LLM settings, MCP settings apply immediately — no restart required.
See Also
Section titled “See Also”- AI Integration - AI features that use LLM configuration
- MCP Server - MCP settings, guardrails, and the learning loop
- Knowledge Base & Grounding - Retrieval, exemplar, and eval settings
- User Management - Role-based access to Admin Settings
- Configuration Guide - Startup configuration reference