refactor-4th-jan-plan
This commit is contained in:
218
your-analysis.md
Normal file
218
your-analysis.md
Normal file
@@ -0,0 +1,218 @@
|
||||
## IGNY8 AI & Configuration Settings Report
|
||||
|
||||
---
|
||||
|
||||
### 1. AI Mode Configuration
|
||||
|
||||
**Architecture**: Two-tier database-driven model configuration system
|
||||
|
||||
#### AIModelConfig Model (Primary)
|
||||
Stores all AI model configurations in database, replacing legacy hardcoded constants.
|
||||
|
||||
**Model Types**:
|
||||
- Text Generation
|
||||
- Image Generation
|
||||
- Embedding
|
||||
|
||||
**Supported Providers**:
|
||||
- OpenAI
|
||||
- Anthropic
|
||||
- Runware
|
||||
- Google
|
||||
|
||||
**Key Configuration Fields**:
|
||||
|
||||
| Category | Fields |
|
||||
|----------|--------|
|
||||
| **Identity** | `model_id`, `display_name`, `model_type`, `provider` |
|
||||
| **Text Pricing** | `input_token_rate`, `output_token_rate` (per 1M tokens in USD) |
|
||||
| **Text Limits** | `max_input_tokens`, `max_output_tokens` |
|
||||
| **Image Pricing** | `cost_per_image` (fixed USD per image) |
|
||||
| **Image Config** | `available_sizes` (JSON array of valid dimensions) |
|
||||
| **Capabilities** | `supports_json_mode`, `supports_vision`, `supports_tools` |
|
||||
| **Status** | `is_active`, `is_default`, `sort_order` |
|
||||
| **Metadata** | `notes`, `release_date`, `deprecation_date` |
|
||||
|
||||
**Seeded Models**:
|
||||
- **OpenAI Text**: gpt-4.1 (default), gpt-4o-mini, gpt-4o, gpt-5.1, gpt-5.2
|
||||
- **Anthropic Text**: claude-3-5-sonnet, claude-3-opus, claude-3-haiku variants
|
||||
- **OpenAI Image**: dall-e-3 (default), dall-e-2, gpt-image-1, gpt-image-1-mini
|
||||
- **Runware/Bria**: runware:100@1, bria-2.3, bria-2.3-fast, bria-2.2
|
||||
|
||||
---
|
||||
|
||||
### 2. Global Integration Settings
|
||||
|
||||
**Model**: `GlobalIntegrationSettings` (Singleton - always pk=1)
|
||||
|
||||
Stores **platform-wide** API keys and default settings used by ALL accounts.
|
||||
|
||||
| Provider | API Key Field | Default Model | Parameters |
|
||||
|----------|---------------|---------------|------------|
|
||||
| **OpenAI** | `openai_api_key` | gpt-4o-mini | temperature: 0.7, max_tokens: 8192 |
|
||||
| **Anthropic** | `anthropic_api_key` | claude-3-5-sonnet-20241022 | temperature: 0.7, max_tokens: 8192 |
|
||||
| **DALL-E** | `dalle_api_key` | dall-e-3 | size: 1024x1024 |
|
||||
| **Runware** | `runware_api_key` | runware:97@1 | — |
|
||||
| **Bria** | `bria_api_key` | bria-2.3 | — |
|
||||
|
||||
**Default Provider Settings**:
|
||||
- `default_text_provider`: 'openai' or 'anthropic'
|
||||
- `default_image_service`: 'openai' or 'runware'
|
||||
|
||||
**Universal Image Settings**:
|
||||
- `image_quality`: standard/hd
|
||||
- `image_style`: photorealistic, illustration, etc.
|
||||
- `max_in_article_images`: Default 2
|
||||
- `desktop_image_size`: Default 1024x1024
|
||||
|
||||
**Critical Security Rule**: API keys exist ONLY in GlobalIntegrationSettings - never stored at account/user level.
|
||||
|
||||
---
|
||||
|
||||
### 3. Frontend Configuration Settings Panel
|
||||
|
||||
**Structure**: Three main setting hierarchies
|
||||
|
||||
#### Account Section (`/account/*`)
|
||||
| Page | Tabs | Purpose |
|
||||
|------|------|---------|
|
||||
| Account Settings | Account, Profile, Team | User account management |
|
||||
| Content Settings | Content, Publishing, Images | Content creation workflow |
|
||||
| Plans & Billing | Plan, Upgrade, Invoices | Subscription management |
|
||||
| Usage Analytics | Overview, Credits, Activity | Usage tracking |
|
||||
|
||||
#### Settings Section (`/settings/*`)
|
||||
| Page | Purpose |
|
||||
|------|---------|
|
||||
| General | Table settings, app preferences |
|
||||
| System | Global platform settings |
|
||||
| AI Settings | AI model configuration |
|
||||
| Integration | API integrations (Admin only) |
|
||||
| Publishing | Publishing destinations & rules |
|
||||
|
||||
#### Site-Level Settings (`/sites/:id/settings`)
|
||||
**Tabs**: general, content-generation, image-settings, integrations, publishing, content-types
|
||||
|
||||
**State Management**: Zustand store with persistence middleware (`useSettingsStore`)
|
||||
|
||||
**Available Settings Keys**:
|
||||
- `table_settings`: records_per_page, default_sort, sort_direction
|
||||
- `user_preferences`: theme, language, notifications
|
||||
- `ai_settings`: model overrides, temperature, max_tokens
|
||||
- `planner_automation`: automation rules
|
||||
- `writer_automation`: content generation rules
|
||||
|
||||
---
|
||||
|
||||
### 4. User-Specific Record Creation (Save Mechanism)
|
||||
|
||||
**Three-Tier Hierarchy**:
|
||||
```
|
||||
Global (Platform) → Account (Tenant) → User (Personal)
|
||||
```
|
||||
|
||||
#### Models Involved
|
||||
|
||||
| Model | Scope | Unique Key |
|
||||
|-------|-------|------------|
|
||||
| `GlobalIntegrationSettings` | Platform-wide | Singleton (pk=1) |
|
||||
| `AccountSettings` | Per-tenant | account + key |
|
||||
| `IntegrationSettings` | Per-tenant overrides | account + integration_type |
|
||||
| `UserSettings` | Per-user preferences | user + account + key |
|
||||
|
||||
#### Save Flow When User Changes Config
|
||||
|
||||
1. **Frontend** calls POST/PUT to `/api/v1/system/settings/user/`
|
||||
2. **Backend** ViewSet extracts user and account from authenticated request
|
||||
3. **Check existing**: Query for existing setting with same user + account + key
|
||||
4. **Create or Update**:
|
||||
- If not exists → `serializer.save(user=user, account=account)` creates new record
|
||||
- If exists → Updates the `value` JSON field
|
||||
5. **Validation**: Schema validation runs against `SETTINGS_SCHEMAS` before save
|
||||
6. **Response** returns the saved setting object
|
||||
|
||||
#### Integration Override Pattern
|
||||
|
||||
For AI/integration settings specifically:
|
||||
1. User changes model/temperature (NOT API keys)
|
||||
2. System strips any API key fields from request (security)
|
||||
3. `IntegrationSettings.objects.get_or_create(account=account, integration_type=type)`
|
||||
4. Only allowed override fields saved in `config` JSON field
|
||||
5. On read, system merges: Global defaults → Account overrides
|
||||
|
||||
---
|
||||
|
||||
### 5. Unused/Deprecated Fields
|
||||
|
||||
| Field/Item | Location | Status |
|
||||
|------------|----------|--------|
|
||||
| `reference_id` | CreditTransaction model | **DEPRECATED** - Use `payment` FK instead |
|
||||
| `mobile_image_size` | GlobalIntegrationSettings | **REMOVED** - No longer needed |
|
||||
| `max_items` parameter | validators.py | **Deprecated** - No longer enforced |
|
||||
| `get_model()` method | AICore class | **DEPRECATED** - Raises ValueError, model must be passed directly |
|
||||
| `run_request()` method | AICore class | **DEPRECATED** - Redirects to `run_ai_request()` |
|
||||
| `persist_task_metadata_to_content()` | MetadataMappingService | **DEPRECATED** - Content model no longer has task field |
|
||||
| `DeploymentService` | publishing/services/ | **DEPRECATED** - Legacy SiteBlueprint service |
|
||||
| SiteBlueprint model references | Multiple files | **REMOVED** - SiteBuilder deprecated |
|
||||
|
||||
---
|
||||
|
||||
### 6. Image Generation: Internal Cost vs Customer Credit Allocation
|
||||
|
||||
#### Internal Cost (What Platform Pays to Providers)
|
||||
|
||||
| Model | Provider | Cost Per Image (USD) |
|
||||
|-------|----------|---------------------|
|
||||
| dall-e-3 | OpenAI | $0.040 |
|
||||
| dall-e-2 | OpenAI | $0.020 |
|
||||
| gpt-image-1 | OpenAI | $0.042 |
|
||||
| gpt-image-1-mini | OpenAI | $0.011 |
|
||||
| runware:100@1 | Runware | ~$0.008-0.009 |
|
||||
| bria-2.3 | Bria | ~$0.015 |
|
||||
|
||||
**Storage**: AIModelConfig.`cost_per_image` field + legacy `IMAGE_MODEL_RATES` constants
|
||||
|
||||
#### Customer Credit Cost (What Customer Pays)
|
||||
|
||||
| Operation | Credits Charged | Price per Credit | Min Charge |
|
||||
|-----------|-----------------|------------------|------------|
|
||||
| Image Generation | 5 credits | $0.02 | $0.10 |
|
||||
| Image Prompt Extraction | 2 credits | $0.01 | $0.02 |
|
||||
|
||||
**Configuration Model**: `CreditCostConfig`
|
||||
- `tokens_per_credit`: 50 (image gen uses fewer tokens per credit = higher cost)
|
||||
- `min_credits`: 5
|
||||
- `price_per_credit_usd`: $0.02
|
||||
|
||||
#### Margin Calculation
|
||||
|
||||
| Metric | DALL-E 3 Example |
|
||||
|--------|------------------|
|
||||
| Provider Cost | $0.040 |
|
||||
| Customer Charge | $0.10 (5 credits × $0.02) |
|
||||
| **Margin** | $0.06 (60% of customer charge) |
|
||||
| **Markup** | ~150% |
|
||||
|
||||
**Flow**:
|
||||
1. **Before AI call**: Calculate required credits based on image count
|
||||
2. **Check balance**: Verify account has sufficient credits
|
||||
3. **Deduct credits**: Remove from balance, log transaction
|
||||
4. **Execute**: Make AI provider API call
|
||||
5. **Track**: `CreditUsageLog` stores both `credits_used` (customer) and `cost_usd` (actual)
|
||||
|
||||
**Revenue Analytics** queries `CreditUsageLog` to calculate:
|
||||
- Total revenue = Σ(credits_used × credit_price)
|
||||
- Total cost = Σ(cost_usd from provider)
|
||||
- Margin = Revenue - Cost
|
||||
|
||||
---
|
||||
|
||||
### Summary
|
||||
|
||||
The IGNY8 platform implements a sophisticated multi-tier configuration system:
|
||||
|
||||
- **AI configuration** is database-driven with fallback to legacy constants
|
||||
- **Global settings** hold platform API keys; accounts only override model/parameters
|
||||
- **User settings** create per-user records keyed by user + account + key combination
|
||||
- **Credit system** charges customers a markup (~150%) over actual provider costs
|
||||
- **Several fields are deprecated** including `mobile_image_size`, `reference_id`, and the `get_model()` method
|
||||
Reference in New Issue
Block a user