image s imsages images model fixes new model see dream
This commit is contained in:
@@ -194,7 +194,7 @@ class SystemAISettings(models.Model):
|
||||
|
||||
@classmethod
|
||||
def get_effective_quality_tier(cls, account=None) -> str:
|
||||
"""Get quality_tier, checking account override first (from ai_settings key)"""
|
||||
"""Get quality_tier, checking account override first, then default image model"""
|
||||
if account:
|
||||
# Check consolidated ai_settings first
|
||||
try:
|
||||
@@ -214,6 +214,21 @@ class SystemAISettings(models.Model):
|
||||
override = cls._get_account_override(account, 'ai.quality_tier')
|
||||
if override is not None:
|
||||
return str(override)
|
||||
|
||||
# No account override - get tier from DEFAULT image model (is_default=True)
|
||||
try:
|
||||
from igny8_core.business.billing.models import AIModelConfig
|
||||
default_model = AIModelConfig.objects.filter(
|
||||
model_type='image',
|
||||
is_default=True,
|
||||
is_active=True
|
||||
).first()
|
||||
if default_model and default_model.quality_tier:
|
||||
return default_model.quality_tier
|
||||
except Exception as e:
|
||||
logger.debug(f"Could not get default image model tier: {e}")
|
||||
|
||||
# Ultimate fallback
|
||||
return cls.get_instance().default_quality_tier
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -793,23 +793,38 @@ class IntegrationSettingsViewSet(viewsets.ViewSet):
|
||||
}
|
||||
|
||||
elif integration_type == 'image_generation':
|
||||
# Model-specific landscape sizes
|
||||
MODEL_LANDSCAPE_SIZES = {
|
||||
'runware:97@1': '1280x768',
|
||||
'bria:10@1': '1344x768',
|
||||
'google:4@2': '1376x768',
|
||||
}
|
||||
from igny8_core.business.billing.models import AIModelConfig
|
||||
from igny8_core.modules.system.ai_settings import AISettings
|
||||
|
||||
# Get default image model from AIModelConfig
|
||||
default_model = ModelRegistry.get_default_model('image')
|
||||
if default_model:
|
||||
model_config = ModelRegistry.get_model(default_model)
|
||||
default_service = model_config.provider if model_config else 'openai'
|
||||
# Get user's quality tier (from account settings)
|
||||
quality_tier = AISettings.get_effective_quality_tier(account)
|
||||
|
||||
# Find image model based on quality tier (DYNAMIC from database)
|
||||
model_config = None
|
||||
if quality_tier:
|
||||
model_config = AIModelConfig.objects.filter(
|
||||
model_type='image',
|
||||
quality_tier=quality_tier,
|
||||
is_active=True
|
||||
).first()
|
||||
|
||||
# Fallback to default image model
|
||||
if not model_config:
|
||||
default_model = ModelRegistry.get_default_model('image')
|
||||
if default_model:
|
||||
model_config = ModelRegistry.get_model(default_model)
|
||||
|
||||
# Extract settings from model config
|
||||
if model_config:
|
||||
default_service = model_config.provider or 'openai'
|
||||
default_model = model_config.model_name
|
||||
model_landscape_size = model_config.landscape_size or '1792x1024'
|
||||
model_square_size = model_config.square_size or '1024x1024'
|
||||
else:
|
||||
default_service = 'openai'
|
||||
default_model = 'dall-e-3'
|
||||
|
||||
model_landscape_size = MODEL_LANDSCAPE_SIZES.get(default_model, '1280x768')
|
||||
model_landscape_size = '1792x1024'
|
||||
model_square_size = '1024x1024'
|
||||
|
||||
response_data = {
|
||||
'id': 'image_generation',
|
||||
@@ -826,8 +841,11 @@ class IntegrationSettingsViewSet(viewsets.ViewSet):
|
||||
'image_format': 'webp',
|
||||
'desktop_enabled': True,
|
||||
'featured_image_size': model_landscape_size,
|
||||
'in_article_landscape_size': model_landscape_size,
|
||||
'in_article_square_size': model_square_size,
|
||||
'desktop_image_size': SystemAISettings.get_effective_image_size(account),
|
||||
'using_global': True,
|
||||
'quality_tier': quality_tier,
|
||||
}
|
||||
else:
|
||||
# Other integration types - return empty
|
||||
@@ -856,9 +874,11 @@ class IntegrationSettingsViewSet(viewsets.ViewSet):
|
||||
1. SystemAISettings (singleton) provides system-wide defaults
|
||||
2. AccountSettings (key-value) provides per-account overrides
|
||||
3. API keys come from IntegrationProvider (accounts cannot override API keys)
|
||||
4. Model config (sizes, etc.) from AIModelConfig (DYNAMIC, single source of truth)
|
||||
"""
|
||||
from igny8_core.modules.system.ai_settings import SystemAISettings
|
||||
from igny8_core.modules.system.ai_settings import SystemAISettings, AISettings
|
||||
from igny8_core.ai.model_registry import ModelRegistry
|
||||
from igny8_core.business.billing.models import AIModelConfig
|
||||
|
||||
account = getattr(request, 'account', None)
|
||||
|
||||
@@ -868,29 +888,36 @@ class IntegrationSettingsViewSet(viewsets.ViewSet):
|
||||
if user and hasattr(user, 'is_authenticated') and user.is_authenticated:
|
||||
account = getattr(user, 'account', None)
|
||||
|
||||
# Model-specific landscape sizes
|
||||
MODEL_LANDSCAPE_SIZES = {
|
||||
'runware:97@1': '1280x768', # Hi Dream Full landscape
|
||||
'bria:10@1': '1344x768', # Bria 3.2 landscape (16:9)
|
||||
'google:4@2': '1376x768', # Nano Banana landscape (16:9)
|
||||
'dall-e-3': '1792x1024', # DALL-E 3 landscape
|
||||
'dall-e-2': '1024x1024', # DALL-E 2 square only
|
||||
}
|
||||
|
||||
try:
|
||||
# Get default image model from AIModelConfig
|
||||
default_model = ModelRegistry.get_default_model('image')
|
||||
if default_model:
|
||||
model_config = ModelRegistry.get_model(default_model)
|
||||
provider = model_config.provider if model_config else 'openai'
|
||||
model = default_model
|
||||
# Get user's quality tier from account settings (DYNAMIC)
|
||||
quality_tier = AISettings.get_effective_quality_tier(account)
|
||||
|
||||
# Find image model based on quality tier (DYNAMIC from database)
|
||||
model_config = None
|
||||
if quality_tier:
|
||||
model_config = AIModelConfig.objects.filter(
|
||||
model_type='image',
|
||||
quality_tier=quality_tier,
|
||||
is_active=True
|
||||
).first()
|
||||
|
||||
# Fallback to default image model
|
||||
if not model_config:
|
||||
default_model = ModelRegistry.get_default_model('image')
|
||||
if default_model:
|
||||
model_config = ModelRegistry.get_model(default_model)
|
||||
|
||||
# Extract settings from model config (SINGLE SOURCE OF TRUTH)
|
||||
if model_config:
|
||||
provider = model_config.provider or 'openai'
|
||||
model = model_config.model_name
|
||||
model_landscape_size = model_config.landscape_size or '1792x1024'
|
||||
model_square_size = model_config.square_size or '1024x1024'
|
||||
else:
|
||||
provider = 'openai'
|
||||
model = 'dall-e-3'
|
||||
|
||||
# Get model-specific landscape size
|
||||
model_landscape_size = MODEL_LANDSCAPE_SIZES.get(model, '1280x768')
|
||||
default_featured_size = model_landscape_size if provider == 'runware' else '1792x1024'
|
||||
model_landscape_size = '1792x1024'
|
||||
model_square_size = '1024x1024'
|
||||
|
||||
# Get image style from SystemAISettings with AccountSettings overrides
|
||||
image_style = SystemAISettings.get_effective_image_style(account)
|
||||
@@ -915,7 +942,7 @@ class IntegrationSettingsViewSet(viewsets.ViewSet):
|
||||
if not image_style or image_style in ['natural', 'vivid']:
|
||||
image_style = 'photorealistic'
|
||||
|
||||
logger.info(f"[get_image_generation_settings] Returning: provider={provider}, model={model}, image_style={image_style}")
|
||||
logger.info(f"[get_image_generation_settings] Returning: provider={provider}, model={model}, image_style={image_style}, quality_tier={quality_tier}")
|
||||
|
||||
return success_response(
|
||||
data={
|
||||
@@ -927,8 +954,11 @@ class IntegrationSettingsViewSet(viewsets.ViewSet):
|
||||
'max_in_article_images': SystemAISettings.get_effective_max_images(account),
|
||||
'image_format': 'webp',
|
||||
'desktop_enabled': True,
|
||||
'featured_image_size': default_featured_size,
|
||||
'featured_image_size': model_landscape_size,
|
||||
'in_article_landscape_size': model_landscape_size,
|
||||
'in_article_square_size': model_square_size,
|
||||
'desktop_image_size': SystemAISettings.get_effective_image_size(account),
|
||||
'quality_tier': quality_tier,
|
||||
}
|
||||
},
|
||||
request=request
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 5.2.10 on 2026-01-10 12:46
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('system', '0023_systemaisettings_max_allowed_images_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='systemaisettings',
|
||||
name='default_quality_tier',
|
||||
field=models.CharField(choices=[('basic', 'Basic'), ('quality', 'Quality'), ('quality_option2', 'Quality-Option2'), ('premium', 'Premium')], default='basic', help_text='Default quality tier for image generation', max_length=20),
|
||||
),
|
||||
# Removed DeleteModel for AccountIntegrationOverride - table doesn't exist
|
||||
]
|
||||
@@ -621,15 +621,20 @@ class ContentGenerationSettingsViewSet(viewsets.ViewSet):
|
||||
# Get system defaults
|
||||
system_defaults = SystemAISettings.get_instance()
|
||||
|
||||
# Get default image model (is_default=True) - SINGLE SOURCE OF TRUTH
|
||||
default_image_model = AIModelConfig.get_default_image_model()
|
||||
|
||||
# Determine default tier from default model (not hardcoded)
|
||||
default_tier = default_image_model.quality_tier if default_image_model else 'basic'
|
||||
|
||||
# Apply account overrides or use system defaults
|
||||
temperature = account_settings.get('temperature', system_defaults.temperature)
|
||||
max_tokens = account_settings.get('max_tokens', system_defaults.max_tokens)
|
||||
image_style = account_settings.get('image_style', system_defaults.image_style)
|
||||
max_images = account_settings.get('max_images', system_defaults.max_images_per_article)
|
||||
selected_tier = account_settings.get('quality_tier', system_defaults.default_quality_tier)
|
||||
|
||||
# Get default image model (or model for selected tier)
|
||||
default_image_model = AIModelConfig.get_default_image_model()
|
||||
# Get selected tier: account override > default model's tier
|
||||
selected_tier = account_settings.get('quality_tier') or default_tier
|
||||
|
||||
# Try to find model matching selected tier
|
||||
selected_model = AIModelConfig.objects.filter(
|
||||
|
||||
Reference in New Issue
Block a user