Skip to Content
DevelopmentBackendUser Settings

User Settings

The User model stores preferences in a user_settings JSONB column, including LLM defaults, UI preferences, notifications, and localization settings.

Schema Structure

user-settings-schema.json
{
  "version": 1,
  "models": {
    "generation": {
      "model_id": "uuid-of-model",
      "fallback_model_id": "uuid-of-fallback-model",
      "temperature": 0.7,
      "max_tokens": 2000
    },
    "evaluation": {
      "model_id": "uuid-of-model",
      "fallback_model_id": "uuid-of-fallback-model",
      "temperature": 0.3,
      "max_tokens": 1000
    }
  },
  "ui": {
    "theme": "light",
    "density": "comfortable",
    "sidebar_collapsed": false,
    "default_page_size": 25
  },
  "notifications": {
    "email": {
      "test_run_complete": true,
      "test_failures": true,
      "weekly_summary": false
    },
    "in_app": {
      "test_run_complete": true,
      "mentions": true
    }
  },
  "localization": {
    "language": "en",
    "timezone": "UTC",
    "date_format": "YYYY-MM-DD",
    "time_format": "24h"
  },
  "privacy": {
    "show_email": false,
    "show_activity": true
  }
}

Usage

Access settings via the user.settings property, which provides type-safe access to all preferences:

accessing-settings.py
# Model preferences
model_id = user.settings.models.generation.model_id
temperature = user.settings.models.generation.temperature
max_tokens = user.settings.models.generation.max_tokens

# UI settings
theme = user.settings.ui.theme
page_size = user.settings.ui.default_page_size

# Notifications
email_prefs = user.settings.notifications.email

# Update settings (deep merge)
user.settings.update({
    "models": {
        "generation": {
            "model_id": str(new_model.id),
            "temperature": 0.8
        }
    }
})
user.user_settings = user.settings.raw
await db.commit()

API Endpoints

settings-endpoints.http
# Get user settings
GET /api/users/me

# Update user settings
PATCH /api/users/me/settings
Content-Type: application/json

{
"models": {
    "generation": {
      "model_id": "550e8400-e29b-41d4-a716-446655440000",
      "temperature": 0.7
    }
}
}

Validation

Settings are validated using Pydantic schemas in rhesis.backend.app.schemas.user:

  • LLMModelSettings: Temperature (0.0-2.0), max_tokens (>0)
  • UISettings: Theme choices, page size (1-100)
  • NotificationSettings: Boolean preferences

Best Practices

  1. Access settings via user.settings property, not the raw user_settings dictionary
  2. Handle None values - properties return None for missing settings
  3. Use user.settings.update() for deep merge updates
  4. Remember to persist: user.user_settings = user.settings.raw and commit
  5. Provide sensible defaults when settings are unspecified

Example

generation-service.py
# Get user's preferred model with fallback
model_id = user.settings.models.generation.model_id
model = await get_model_by_id(db, model_id) if model_id else None
if not model:
    model = await get_system_default_model(db, purpose="generation")

# Use settings or defaults
temperature = user.settings.models.generation.temperature or 0.7
max_tokens = user.settings.models.generation.max_tokens