Two users of the same AI product want different things from it — one wants terse bullet-point answers, another wants long-form prose; one wants responses in Spanish, another in code blocks only. When every parameter is hardcoded in the system prompt, the product optimizes for the median user and disappoints everyone else. A small settings panel with response style, language, and a custom-instructions textarea dramatically widens the product's fit across the user base at minimal engineering cost.
Medium because hardcoded behavior caps customer fit but does not break the core flow.
Persist a user_preferences row keyed by user id with at least response_style, language, and custom_instructions fields. Inject the selected style into the system prompt on each request. Expose the settings at /settings/ai and mirror to localStorage for anonymous users. Implement in app/settings/ai/page.tsx.
const systemPrompt = `${BASE_PROMPT}\n\nResponse style: ${prefs.responseStyle}. ${prefs.customInstructions ?? ''}`
ID: ai-ux-patterns.advanced-patterns.settings-preferences
Severity: medium
What to look for: Count all configurable AI behavior parameters: response length, tone selection, language, memory preferences, notification settings. For each, enumerate whether it is exposed in a user-facing settings UI and whether the value is persisted (localStorage, user profile in database). Look for a dedicated app/settings/ route, a settings modal, or a dropdown configuration menu. At least 1 parameter must be persisted.
Pass criteria: A settings or preferences interface exists with at least 1 configurable AI behavior parameter. Settings are persisted between sessions. Report on pass: "X configurable parameters; persisted via Y."
Fail criteria: No settings or preferences panel found. AI behavior is entirely fixed with no user configuration.
Skip (N/A) when: The application is a single-purpose tool with no configurable behavior — for example, a dedicated code linter or a fixed-format document generator where behavioral variation would be a defect.
Detail on fail: "No settings or preferences UI detected. AI behavior parameters appear hardcoded with no per-user configuration.".
Remediation: Even one or two adjustable parameters dramatically improve perceived customizability:
// Settings schema stored in user preferences
type AIPreferences = {
responseStyle: 'concise' | 'balanced' | 'detailed'
language: string
enableMarkdown: boolean
}
// In the settings panel
<div className="space-y-4">
<div>
<label className="text-sm font-medium">Response Style</label>
<Select value={prefs.responseStyle} onValueChange={(v) => updatePref('responseStyle', v)}>
<SelectItem value="concise">Concise — short, direct answers</SelectItem>
<SelectItem value="balanced">Balanced — default</SelectItem>
<SelectItem value="detailed">Detailed — thorough explanations</SelectItem>
</Select>
</div>
</div>