8.0 KiB
AIModelConfig Integration Complete ✅
Date: December 23, 2025
Change Type: Model Architecture Update
Summary
Successfully updated GlobalIntegrationSettings to use ForeignKey relationships to AIModelConfig instead of hardcoded CharField choices. This creates a single source of truth for all AI model configurations across the platform.
Changes Made
1. Model Updates
File: backend/igny8_core/modules/system/global_settings_models.py
Added Import:
from igny8_core.business.billing.models import AIModelConfig
Removed Hardcoded Choices:
OPENAI_MODEL_CHOICES(6 options)DALLE_MODEL_CHOICES(2 options)RUNWARE_MODEL_CHOICES(3 options)
Converted CharField to ForeignKey:
-
openai_model
- Before:
CharField(max_length=100, default='gpt-4o-mini', choices=OPENAI_MODEL_CHOICES) - After:
ForeignKey('billing.AIModelConfig', limit_choices_to={'provider': 'openai', 'model_type': 'text', 'is_active': True}) - Related name:
global_openai_text_model
- Before:
-
dalle_model
- Before:
CharField(max_length=100, default='dall-e-3', choices=DALLE_MODEL_CHOICES) - After:
ForeignKey('billing.AIModelConfig', limit_choices_to={'provider': 'openai', 'model_type': 'image', 'is_active': True}) - Related name:
global_dalle_model
- Before:
-
runware_model
- Before:
CharField(max_length=100, default='runware:97@1', choices=RUNWARE_MODEL_CHOICES) - After:
ForeignKey('billing.AIModelConfig', limit_choices_to={'provider': 'runware', 'model_type': 'image', 'is_active': True}) - Related name:
global_runware_model
- Before:
2. Admin Sidebar Update
File: backend/igny8_core/admin/site.py
Moved AIModelConfig:
- From: "Credits" group
- To: "AI & Automation" group (positioned at top)
New "AI & Automation" Order:
- AIModelConfig ← MOVED HERE
- IntegrationSettings
- GlobalModuleSettings
- GlobalIntegrationSettings
- GlobalAIPrompt
- GlobalAuthorProfile
- GlobalStrategy
- AIPrompt (account-specific)
- Strategy (account-specific)
- AuthorProfile (account-specific)
- APIKey, WebhookConfig, AutomationConfig, AutomationRun
3. Database Migration
File: backend/igny8_core/modules/system/migrations/0005_link_global_settings_to_aimodelconfig.py
Migration Steps:
- Add 3 new ForeignKey fields with temporary names (
*_new) - Rename old CharField fields to
*_old - Run data migration to convert string values to FK IDs
- Remove old CharField fields
- Rename new FK fields to final names (
openai_model,dalle_model,runware_model)
Data Migration Results:
✓ Mapped openai_model: gpt-4o-mini → AIModelConfig ID 1
✓ Mapped dalle_model: dall-e-3 → AIModelConfig ID 7
✓ Mapped runware_model: runware:97@1 → AIModelConfig ID 6
Current State
Database Schema
-- Before
openai_model VARCHAR(100) DEFAULT 'gpt-4o-mini'
dalle_model VARCHAR(100) DEFAULT 'dall-e-3'
runware_model VARCHAR(100) DEFAULT 'runware:97@1'
-- After
openai_model_id BIGINT REFERENCES igny8_ai_model_config(id)
dalle_model_id BIGINT REFERENCES igny8_ai_model_config(id)
runware_model_id BIGINT REFERENCES igny8_ai_model_config(id)
Active GlobalIntegrationSettings (pk=1)
- OpenAI Model: GPT-4o Mini (gpt-4o-mini) - ID: 1
- DALL-E Model: DALL-E 3 (dall-e-3) - ID: 7
- Runware Model: Runware FLUX 1.1 Pro (runware-flux-1.1-pro) - ID: 6
Available AIModelConfig Options
Text Models (provider='openai', model_type='text'):
- GPT-4o Mini (gpt-4o-mini) ← Current
- GPT-3.5 Turbo (gpt-3.5-turbo)
- GPT-4 Turbo (gpt-4-turbo-2024-04-09)
Text Models (provider='anthropic', model_type='text'):
- Claude 3.5 Sonnet (claude-3-5-sonnet-20241022)
- Claude 3 Haiku (claude-3-haiku-20240307)
Image Models (provider='openai', model_type='image'):
- DALL-E 3 (dall-e-3) ← Current
Image Models (provider='runware', model_type='image'):
- Runware FLUX 1.1 Pro (runware-flux-1.1-pro) ← Current
Benefits
1. Single Source of Truth
- All AI model configurations now managed in one place (AIModelConfig)
- Pricing, token limits, and display names centralized
- No duplication of model choices across the codebase
2. Dynamic Model Selection
- Admins can activate/deactivate models without code changes
- New models added to AIModelConfig automatically appear in dropdowns
- Model pricing updates propagate instantly
3. Better Admin UX
- Dropdowns show only active, relevant models
- Display names include pricing information from AIModelConfig
- AIModelConfig in "AI & Automation" group for logical organization
4. Proper Relationships
- Can query: "Which Global settings use this model?"
- Can track: "What's the total cost if we switch to this model?"
- Can cascade: Protected deletion prevents broken references
5. Account Override Compatibility
- Accounts can still override via IntegrationSettings.config JSON
- Services merge:
account.config.openai_model_id || global.openai_model_id || default - FK relationships work for both Global and Account-specific settings
Admin Interface Changes
GlobalIntegrationSettings Admin
Before:
# Dropdown with 6 hardcoded GPT model options
openai_model = [
'gpt-4.1',
'gpt-4o-mini',
'gpt-4o',
'gpt-4-turbo-preview',
'gpt-5.1',
'gpt-5.2'
]
After:
# Dropdown loads from AIModelConfig table
# Only shows: provider='openai', model_type='text', is_active=True
# Displays: "GPT-4o Mini (gpt-4o-mini) - $0.15/$0.60 per 1M tokens"
openai_model = ForeignKey to AIModelConfig
AIModelConfig Admin
New Location: AI & Automation group (was in Credits)
Impact:
- Easier to find when configuring AI settings
- Grouped with other AI/integration configuration
- Removed from billing-focused Credits section
Testing Checklist
- Migration applied successfully
- Backend restarted without errors
- GlobalIntegrationSettings queryable with FK relationships
- AIModelConfig moved to AI & Automation sidebar
- ForeignKey IDs populated correctly (1, 7, 6)
- Admin UI shows dropdowns with active models (manual check recommended)
- Can change models via admin interface
- Account overrides still work via IntegrationSettings.config
- Services correctly merge global + account settings
- Frontend Integration.tsx displays current model selections
API Changes (Future)
The frontend will need updates to handle ForeignKey references:
Before:
{
"openai_model": "gpt-4o-mini"
}
After:
{
"openai_model": 1,
"openai_model_details": {
"id": 1,
"model_name": "gpt-4o-mini",
"display_name": "GPT-4o Mini",
"provider": "openai"
}
}
Next Steps
-
Update Frontend Integration.tsx:
- Fetch list of AIModelConfig options
- Display dropdowns with model names + pricing
- Save FK IDs instead of string identifiers
-
Update Service Layer:
- Change
get_openai_model(account)to return AIModelConfig instance - Use
model.model_namefor API calls - Use
model.display_namefor UI display
- Change
-
Add Anthropic Support:
- GlobalIntegrationSettings currently has openai_model FK
- Consider adding
text_modelFK (generic) to support Claude - Or add
anthropic_modelFK separately
-
Seed More AIModelConfig:
- Add missing models (GPT-4o, GPT-4.1, GPT-5.x if available)
- Update pricing to match current OpenAI rates
- Add more Runware models if needed
-
Update Documentation:
- API docs for new FK structure
- Admin guide for managing AIModelConfig
- Migration guide for existing accounts
Conclusion
The system now has a proper relationship between Global Settings and AI Model Configuration. Instead of maintaining hardcoded lists of models in multiple places, all model definitions live in AIModelConfig, which serves as the single source of truth for:
- Available models
- Pricing per 1K tokens
- Provider information
- Model type (text/image)
- Active/inactive status
This architecture is more maintainable, scalable, and provides better UX for admins managing AI integrations.