# Example: LLM Multi-Provider Config Refactoring PRD This PRD demonstrates the pattern for refactoring a single-config settings page into a multi-profile/multi-provider management system. Useful as a reference for similar settings refactoring tasks. ## Key Design Patterns ### 1. Profile-based storage without new tables Store multiple config profiles as a JSON array in existing key-value settings table. One key for the profiles array, one key for the active profile ID. ``` settings.active_profile_id → "prof_xxx" settings.profiles → '[{...}, {...}]' ``` ### 2. Protocol/behavior follows the item, not the group When a group (provider) can contain items with different behaviors (protocols), put the behavior field on the item level, not the group level. This allows mixing. ### 3. Global defaults with optional per-profile overrides Keep common parameters (temperature, timeout, etc.) at the global level. Profiles can optionally override, but empty = use global. This reduces config complexity. ### 4. Migration from old format Detect old keys → convert to new JSON format → delete old keys. Make migration idempotent (INSERT OR IGNORE pattern). ### 5. Isolate backend changes Refactor the config reader's return format to match what the caller expects. This way downstream consumers (LLM call layer, rate limiter) need zero changes. ## PRD Structure for Settings Refactoring 1. Background: current state table + missing capabilities table 2. User stories focused on the switching/management pain point 3. ASCII wireframe of new UI layout 4. API design with JSON payload (not flat form fields for complex nested data) 5. Data model: JSON in existing table + migration script 6. Security & limits table 7. Architecture change diagram (before/after) 8. File change inventory with impact level (不动/小/中/大) 9. Decision record table 10. Risk table ## Pitfalls Found During This Session - Don't make parameters per-profile by default — most users don't need it, adds UI complexity - Test connection endpoint should be AJAX, not form submit, for better UX - Migration must handle the case where both old and new keys exist (already migrated)