env('AI_EDITING_DEFAULT_PROVIDER', 'runware'), 'entitlements' => [ 'package_feature' => env('AI_EDITING_PACKAGE_FEATURE', 'ai_styling'), 'addon_keys' => array_values(array_filter(array_map( 'trim', explode(',', (string) env('AI_EDITING_ADDON_KEYS', 'ai_styling_unlock')) ))), 'locked_message' => env( 'AI_EDITING_LOCKED_MESSAGE', 'AI editing requires the Premium package or the AI Styling add-on.' ), ], 'safety' => [ 'prompt' => [ 'blocked_terms' => array_filter(array_map('trim', explode(',', (string) env('AI_EDITING_BLOCKED_TERMS', '')))), ], ], 'abuse' => [ 'guest_submit_per_minute' => (int) env('AI_EDITING_GUEST_SUBMIT_PER_MINUTE', 8), 'guest_submit_per_hour' => (int) env('AI_EDITING_GUEST_SUBMIT_PER_HOUR', 40), 'guest_submit_per_event_per_minute' => (int) env('AI_EDITING_GUEST_SUBMIT_PER_EVENT_PER_MINUTE', 40), 'guest_status_per_minute' => (int) env('AI_EDITING_GUEST_STATUS_PER_MINUTE', 60), 'tenant_submit_per_minute' => (int) env('AI_EDITING_TENANT_SUBMIT_PER_MINUTE', 30), 'tenant_submit_per_hour' => (int) env('AI_EDITING_TENANT_SUBMIT_PER_HOUR', 240), 'tenant_submit_per_event_per_minute' => (int) env('AI_EDITING_TENANT_SUBMIT_PER_EVENT_PER_MINUTE', 120), 'tenant_status_per_minute' => (int) env('AI_EDITING_TENANT_STATUS_PER_MINUTE', 120), 'escalation_threshold_per_hour' => (int) env('AI_EDITING_ESCALATION_THRESHOLD_PER_HOUR', 25), 'escalation_cooldown_minutes' => (int) env('AI_EDITING_ESCALATION_COOLDOWN_MINUTES', 30), ], 'queue' => [ 'name' => env('AI_EDITING_QUEUE', 'default'), 'auto_dispatch' => env('AI_EDITING_AUTO_DISPATCH', false), 'max_polls' => (int) env('AI_EDITING_MAX_POLLS', 6), ], 'billing' => [ 'default_unit_cost_usd' => (float) env('AI_EDITING_DEFAULT_UNIT_COST_USD', 0.01), 'budget' => [ 'soft_cap_usd' => env('AI_EDITING_BUDGET_SOFT_CAP_USD'), 'hard_cap_usd' => env('AI_EDITING_BUDGET_HARD_CAP_USD'), 'hard_stop_enabled' => (bool) env('AI_EDITING_BUDGET_HARD_STOP_ENABLED', true), 'alert_cooldown_minutes' => (int) env('AI_EDITING_BUDGET_ALERT_COOLDOWN_MINUTES', 30), ], ], 'retention' => [ 'request_days' => (int) env('AI_EDITING_REQUEST_RETENTION_DAYS', 90), 'usage_ledger_days' => (int) env('AI_EDITING_USAGE_LEDGER_RETENTION_DAYS', 365), ], 'providers' => [ 'runware' => [ 'mode' => env('AI_EDITING_RUNWARE_MODE', 'live'), 'model_search_limit' => (int) env('AI_EDITING_RUNWARE_MODEL_SEARCH_LIMIT', 25), 'model_search_min_chars' => (int) env('AI_EDITING_RUNWARE_MODEL_SEARCH_MIN_CHARS', 2), 'model_search_cache_seconds' => (int) env('AI_EDITING_RUNWARE_MODEL_SEARCH_CACHE_SECONDS', 300), 'defaults' => [ 'width' => (int) env('AI_EDITING_RUNWARE_DEFAULT_WIDTH', 1024), 'height' => (int) env('AI_EDITING_RUNWARE_DEFAULT_HEIGHT', 1024), 'steps' => (int) env('AI_EDITING_RUNWARE_DEFAULT_STEPS', 28), 'cfg_scale' => (float) env('AI_EDITING_RUNWARE_DEFAULT_CFG_SCALE', 7), 'strength' => (float) env('AI_EDITING_RUNWARE_DEFAULT_STRENGTH', 0.75), 'output_format' => env('AI_EDITING_RUNWARE_OUTPUT_FORMAT', 'JPG'), 'delivery_method' => env('AI_EDITING_RUNWARE_DELIVERY_METHOD', 'async'), ], ], ], 'outputs' => [ 'enabled' => (bool) env('AI_EDITING_LOCAL_OUTPUTS_ENABLED', true), 'max_download_bytes' => (int) env('AI_EDITING_OUTPUT_MAX_DOWNLOAD_BYTES', 15 * 1024 * 1024), 'connect_timeout_seconds' => (int) env('AI_EDITING_OUTPUT_CONNECT_TIMEOUT_SECONDS', 10), 'timeout_seconds' => (int) env('AI_EDITING_OUTPUT_TIMEOUT_SECONDS', 60), 'user_agent' => env('AI_EDITING_OUTPUT_USER_AGENT', 'fotospiel-ai-output-fetcher/1.0'), 'allowed_hosts' => array_values(array_filter(array_map( 'trim', explode(',', (string) env('AI_EDITING_OUTPUT_ALLOWED_HOSTS', '')) ))), ], 'observability' => [ 'failure_rate_alert_threshold' => (float) env('AI_EDITING_FAILURE_RATE_ALERT_THRESHOLD', 0.35), 'failure_rate_min_samples' => (int) env('AI_EDITING_FAILURE_RATE_MIN_SAMPLES', 10), 'latency_warning_ms' => (int) env('AI_EDITING_LATENCY_WARNING_MS', 15000), ], ];