My Recommendation: Simplify to 3 Core Concepts
Based on analyzing your plans and the current system, here's the simplest path forward:
Current Pain Points (Summarized)
Area	Problem
API Keys	Scattered in GlobalIntegrationSettings with unused fields (anthropic, bria)
Models	Duplicated in DB (AIModelConfig), constants.py, GlobalIntegrationSettings CHOICES, frontend
Credits	Split between CreditCostConfig (token-based) and image models (per-image) - confusing
Frontend	Hardcoded model lists, not dynamic
Proposed Simplified Architecture
Instead of 7-phase migration, do this:

┌─────────────────────────────────────────────────────────────────┐
│                   SIMPLIFIED TARGET STATE                        │
└─────────────────────────────────────────────────────────────────┘

1. AIModelConfig (ENHANCED) - SINGLE SOURCE OF TRUTH
   ├── All models (text + image)
   ├── is_default flag (one per type)
   ├── tokens_per_credit (text models)
   ├── credits_per_image (image models) 
   ├── quality_tier (basic/quality/premium for user display)
   └── provider field links to API key source

2. IntegrationProvider (NEW) - API KEYS ONLY
   ├── openai → api_key
   ├── runware → api_key
   └── (future: resend, stripe, etc.)

3. GlobalIntegrationSettings (SIMPLIFIED) - NON-MODEL SETTINGS ONLY
   ├── image_style: "photorealistic"
   ├── max_in_article_images: 4
   └── temperature: 0.7  
   (NO model names, NO API keys, NO hardcoded choices)
User-Facing Simplification
For Images (what user sees):

Quality Selection:
  ○ Basic (1 credit/image)      ← maps to runware:97@1
  ○ Quality (5 credits/image)   ← maps to dall-e-3  
  ○ Premium (15 credits/image)  ← maps to google:4@2

Image Count: [1-8 dropdown]
User picks quality tier + count. Backend handles:
Model selection based on quality_tier
Credit calculation: credits_per_image × count
API routing to correct provider
For Text (hidden from user):
Admin controls default model in AIModelConfig.is_default
User has NO options - uses system default
Credits calculated: ceil(tokens / tokens_per_credit)
Simplest Migration Path
Phase 1: Add fields to AIModelConfig (no breaking changes)

# Add to existing AIModelConfig
credits_per_image = IntegerField(null=True)  # For image models
tokens_per_credit = IntegerField(null=True)  # For text models  
quality_tier = CharField(choices=['basic','quality','premium'])
Phase 2: Create IntegrationProvider (move API keys)

# New simple model
class IntegrationProvider(Model):
    provider_id = CharField(primary_key=True)  # openai, runware
    api_key = CharField()
    is_active = BooleanField()
Phase 3: Create single API endpoint

GET /api/v1/system/ai-config/
Returns:
{
  "image_qualities": [
    {"tier": "basic", "credits_per_image": 1, "label": "Basic"},
    {"tier": "quality", "credits_per_image": 5, "label": "Quality"},
    {"tier": "premium", "credits_per_image": 15, "label": "Premium"}
  ],
  "text_model": "gpt-5.1",  // Admin-controlled, user can't change
  "image_style": "photorealistic",
  "max_images": 4
}
Phase 4: Update frontend - load from API, remove hardcodes Phase 5: Cleanup - remove legacy fields from GlobalIntegrationSettings
Key Simplifications
Before	After
User picks model name	User picks quality tier
Multiple credit calculation paths	One path: AIModelConfig
API keys in GlobalIntegrationSettings	API keys in IntegrationProvider
Hardcoded constants.py rates	All from database
6+ admin pages to configure	2 pages: Models + Providers
Do you want me to:
Start implementing this simplified approach? - I can create the migration files and update the models
Create a more detailed breakdown of each phase with specific file changes?
Focus on a specific area first (e.g., just fix image credits, or just move API keys)?
The existing plans in your docs are comprehensive but may be over-engineered. The core problem is simpler: consolidate to AIModelConfig as single source of truth, give users quality tiers instead of model names, and move API keys to a dedicated model.