Files
igny8/AIMODELCONFIG-INTEGRATION-COMPLETE.md
IGNY8 VPS (Salman) 38bc015d96 lot of messs
2025-12-23 14:35:41 +00:00

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:

  1. 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
  2. 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
  3. 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

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:

  1. AIModelConfig ← MOVED HERE
  2. IntegrationSettings
  3. GlobalModuleSettings
  4. GlobalIntegrationSettings
  5. GlobalAIPrompt
  6. GlobalAuthorProfile
  7. GlobalStrategy
  8. AIPrompt (account-specific)
  9. Strategy (account-specific)
  10. AuthorProfile (account-specific)
  11. APIKey, WebhookConfig, AutomationConfig, AutomationRun

3. Database Migration

Migration Steps:

  1. Add 3 new ForeignKey fields with temporary names (*_new)
  2. Rename old CharField fields to *_old
  3. Run data migration to convert string values to FK IDs
  4. Remove old CharField fields
  5. 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

  1. Update Frontend Integration.tsx:

    • Fetch list of AIModelConfig options
    • Display dropdowns with model names + pricing
    • Save FK IDs instead of string identifiers
  2. Update Service Layer:

    • Change get_openai_model(account) to return AIModelConfig instance
    • Use model.model_name for API calls
    • Use model.display_name for UI display
  3. Add Anthropic Support:

    • GlobalIntegrationSettings currently has openai_model FK
    • Consider adding text_model FK (generic) to support Claude
    • Or add anthropic_model FK separately
  4. 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
  5. 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.