14 KiB
14 KiB
Final Model Schemas - Clean State
Overview
This document defines the simplified, clean architecture for AI configuration and billing models.
Total Models: 5 (down from 7)
- IntegrationProvider (API keys)
- AIModelConfig (model definitions + pricing)
- AISettings (system defaults + account overrides) - renamed from GlobalIntegrationSettings
- AccountSettings (generic key-value store)
- CreditCostConfig (operation-level pricing)
Models Removed:
- IntegrationSettings (merged into AISettings/AccountSettings)
- CreditCostConfig.tokens_per_credit (moved to AIModelConfig)
1. IntegrationProvider (API Keys Only)
Centralized storage for ALL external service API keys.
| Field | Type | Required | Notes |
|---|---|---|---|
provider_id |
CharField(50) PK | Yes | openai, runware, stripe, paypal, resend |
display_name |
CharField(100) | Yes | Human-readable name |
provider_type |
CharField(20) | Yes | ai / payment / email / storage |
api_key |
CharField(500) | No | Primary API key |
api_secret |
CharField(500) | No | Secondary secret (Stripe, PayPal) |
webhook_secret |
CharField(500) | No | Webhook signing secret |
api_endpoint |
URLField | No | Custom endpoint (optional) |
config |
JSONField | No | Provider-specific config |
is_active |
BooleanField | Yes | Enable/disable provider |
is_sandbox |
BooleanField | Yes | Test mode flag |
updated_by |
FK(User) | No | Audit trail |
created_at |
DateTime | Auto | |
updated_at |
DateTime | Auto |
Seeded Providers:
openai- AI (text + DALL-E)runware- AI (images)anthropic- AI (future)stripe- Paymentpaypal- Paymentresend- Email
2. AIModelConfig (Single Source of Truth for Models)
All AI models (text + image) with pricing and credit configuration.
| Field | Type | Required | Notes |
|---|---|---|---|
id |
AutoField PK | Auto | |
model_name |
CharField(100) | Yes | gpt-5.1, dall-e-3, runware:97@1 |
model_type |
CharField(20) | Yes | text / image |
provider |
CharField(50) | Yes | Links to IntegrationProvider |
display_name |
CharField(200) | Yes | Human-readable |
is_default |
BooleanField | Yes | One default per type |
is_active |
BooleanField | Yes | Enable/disable |
cost_per_1k_input |
DecimalField | No | Provider cost (USD) - text models |
cost_per_1k_output |
DecimalField | No | Provider cost (USD) - text models |
tokens_per_credit |
IntegerField | No | Text: tokens per 1 credit (e.g., 1000) |
credits_per_image |
IntegerField | No | Image: credits per image (e.g., 1, 5, 15) |
quality_tier |
CharField(20) | No | basic / quality / premium |
max_tokens |
IntegerField | No | Model token limit |
context_window |
IntegerField | No | Model context size |
capabilities |
JSONField | No | vision, function_calling, etc. |
created_at |
DateTime | Auto | |
updated_at |
DateTime | Auto |
Credit Configuration Examples:
| Model | Type | tokens_per_credit | credits_per_image | quality_tier |
|---|---|---|---|---|
| gpt-5.1 | text | 1000 | - | - |
| gpt-4o-mini | text | 10000 | - | - |
| runware:97@1 | image | - | 1 | basic |
| dall-e-3 | image | - | 5 | quality |
| google:4@2 | image | - | 15 | premium |
3. AISettings (Renamed from GlobalIntegrationSettings)
System-wide AI defaults. Singleton (pk=1).
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
id |
AutoField PK | Auto | 1 | Singleton |
temperature |
FloatField | Yes | 0.7 | AI temperature (0.0-2.0) |
max_tokens |
IntegerField | Yes | 8192 | Max response tokens |
image_style |
CharField(30) | Yes | photorealistic | Default image style |
image_quality |
CharField(20) | Yes | standard | standard / hd |
max_images_per_article |
IntegerField | Yes | 4 | Max in-article images |
image_size |
CharField(20) | Yes | 1024x1024 | Default image dimensions |
updated_by |
FK(User) | No | Audit trail | |
updated_at |
DateTime | Auto |
Removed Fields (now elsewhere):
- All
*_api_keyfields → IntegrationProvider - All
*_modelfields → AIModelConfig.is_default default_text_provider→ AIModelConfig.is_default where model_type='text'default_image_service→ AIModelConfig.is_default where model_type='image'
Image Style Choices:
photorealistic- Ultra realistic photographyillustration- Digital illustration3d_render- Computer generated 3Dminimal_flat- Minimal / Flat Designartistic- Artistic / Painterlycartoon- Cartoon / Stylized
4. AccountSettings (Per-Account Overrides)
Generic key-value store for account-specific settings.
| Field | Type | Required | Notes |
|---|---|---|---|
id |
AutoField PK | Auto | |
account |
FK(Account) | Yes | |
key |
CharField(100) | Yes | Setting key |
value |
JSONField | Yes | Setting value |
created_at |
DateTime | Auto | |
updated_at |
DateTime | Auto |
Unique Constraint: (account, key)
AI-Related Keys (override AISettings defaults):
| Key | Type | Example | Notes |
|---|---|---|---|
ai.temperature |
float | 0.7 | Override system default |
ai.max_tokens |
int | 8192 | Override system default |
ai.image_style |
string | "photorealistic" | Override system default |
ai.image_quality |
string | "hd" | Override system default |
ai.max_images |
int | 6 | Override system default |
ai.image_quality_tier |
string | "quality" | User's preferred tier |
5. CreditCostConfig (Operation-Level Pricing)
Fixed credit costs per operation type.
| Field | Type | Required | Notes |
|---|---|---|---|
operation_type |
CharField(50) PK | Yes | Unique operation ID |
display_name |
CharField(100) | Yes | Human-readable |
base_credits |
IntegerField | Yes | Fixed credits per operation |
is_active |
BooleanField | Yes | Enable/disable |
description |
TextField | No | Admin notes |
Removed: tokens_per_credit (now in AIModelConfig)
Frontend Settings Structure
Content Generation Settings Tab
┌─────────────────────────────────────────────────────────────┐
│ Content Generation Settings │
├─────────────────────────────────────────────────────────────┤
│ │
│ AI Parameters │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Temperature [=====○====] 0.7 │ │
│ │ More focused ←→ More creative │ │
│ │ │ │
│ │ Max Tokens [8192 ▼] │ │
│ │ Response length limit │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Image Generation │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Image Quality │ │
│ │ ○ Basic (1 credit/image) - Fast, simple │ │
│ │ ● Quality (5 credits/image) - Balanced │ │
│ │ ○ Premium (15 credits/image) - Best quality │ │
│ │ │ │
│ │ Image Style [Photorealistic ▼] │ │
│ │ │ │
│ │ Images per Article [4 ▼] (max 8) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ [Save Settings] │
└─────────────────────────────────────────────────────────────┘
Frontend API Response
GET /api/v1/accounts/settings/ai/
Response:
{
"content_generation": {
"temperature": 0.7,
"max_tokens": 8192
},
"image_generation": {
"quality_tiers": [
{"tier": "basic", "credits": 1, "label": "Basic", "description": "Fast, simple images"},
{"tier": "quality", "credits": 5, "label": "Quality", "description": "Balanced quality"},
{"tier": "premium", "credits": 15, "label": "Premium", "description": "Best quality"}
],
"selected_tier": "quality",
"styles": [
{"value": "photorealistic", "label": "Photorealistic"},
{"value": "illustration", "label": "Illustration"},
{"value": "3d_render", "label": "3D Render"},
{"value": "minimal_flat", "label": "Minimal / Flat"},
{"value": "artistic", "label": "Artistic"},
{"value": "cartoon", "label": "Cartoon"}
],
"selected_style": "photorealistic",
"max_images": 4,
"max_allowed": 8
}
}
Save Settings Request
PUT /api/v1/accounts/settings/ai/
Request:
{
"temperature": 0.8,
"max_tokens": 4096,
"image_quality_tier": "premium",
"image_style": "illustration",
"max_images": 6
}
Data Flow
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ IntegrationProv. │ │ AIModelConfig │ │ AISettings │
│ │ │ │ │ (Singleton) │
│ - API keys │◄────│ - Model list │ │ │
│ - Provider info │ │ - Pricing │ │ - Defaults │
└──────────────────┘ │ - Credits config │ │ - temperature │
│ - quality_tier │ │ - max_tokens │
└────────┬─────────┘ │ - image_style │
│ └────────┬─────────┘
│ │
▼ ▼
┌──────────────────────────────────────────┐
│ AccountSettings │
│ │
│ Account-specific overrides: │
│ - ai.temperature = 0.8 │
│ - ai.image_quality_tier = "premium" │
│ - ai.image_style = "illustration" │
└──────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ Frontend Settings UI │
│ │
│ GET /api/v1/accounts/settings/ai/ │
│ - Merges AISettings + AccountSettings │
│ - Returns effective values for account │
└──────────────────────────────────────────┘
Migration Summary
| From | To | Action |
|---|---|---|
| GlobalIntegrationSettings.*_api_key | IntegrationProvider | Already done |
| GlobalIntegrationSettings.*_model | AIModelConfig.is_default | Already done |
| GlobalIntegrationSettings (remaining) | AISettings (rename) | Phase 3 |
| IntegrationSettings | AccountSettings | Phase 3 - delete model |
| CreditCostConfig.tokens_per_credit | AIModelConfig.tokens_per_credit | Already done |
Phase 3 Implementation Steps
- Rename Model: GlobalIntegrationSettings → AISettings
- Remove Fields: All
*_api_key,*_modelfields from AISettings - Create API Endpoint:
/api/v1/accounts/settings/ai/ - Update Frontend: Load from new endpoint, use quality_tier picker
- Delete Model: IntegrationSettings (after migrating any data)
- Cleanup: Remove deprecated choices/constants
Files to Modify (Phase 3)
| File | Change |
|---|---|
modules/system/global_settings_models.py |
Rename class, remove deprecated fields |
modules/system/admin.py |
Update admin for AISettings |
modules/system/views.py |
New AI settings API endpoint |
modules/system/serializers.py |
AISettingsSerializer |
settings.py |
Update admin sidebar |
ai/ai_core.py |
Use AISettings instead of GlobalIntegrationSettings |
| Frontend | New settings component with quality tier picker |