Sistema Switch Provider Indipendenti

Sistema Switch Provider Indipendenti

Implementato: 22 Ottobre 2025 Feature: Multi-provider con switch radio indipendenti

---

🎯 Come Funziona

Concetto

Configuri tutti i provider una volta (OpenAI, Claude, Gemini) Switchi quello attivo con un click (radio button) Solo 1 attivo alla volta (o nessuno)

---

πŸ–₯️ UI Finale

Vista Provider

``

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ βœ… Provider Attivo: OpenAI                             β”‚
β”‚    Modello: gpt-4o-mini | Temp: 0.3 | Tokens: 800    β”‚
β”‚    [⚑ Disattiva Tutto]                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜</p><p>β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 🟒 OpenAI        [●] β”‚ β”‚ 🟣 Claude        [β—‹] β”‚ β”‚ πŸ”΅ Gemini        [β—‹] β”‚
β”‚ Configurato          β”‚ β”‚ Configurato          β”‚ β”‚ Non configurato      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Modelli:             β”‚ β”‚ Modelli:             β”‚ β”‚ Modelli:             β”‚
β”‚ β€’ GPT-4o Mini [β˜…]    β”‚ β”‚ β€’ Claude Haiku [β˜…]   β”‚ β”‚ β€’ Gemini Flash [β˜…]   β”‚
β”‚ β€’ GPT-4o             β”‚ β”‚ β€’ Claude Sonnet      β”‚ β”‚ β€’ Gemini Pro         β”‚
β”‚                      β”‚ β”‚                      β”‚ β”‚                      β”‚
β”‚ [Modifica]           β”‚ β”‚ [Modifica] [Attiva]  β”‚ β”‚ [Configura]          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
`
</p><p><strong>Radio Button [●]/[β—‹]</strong>:
<ul><li>[●] = Attivo (solo 1 alla volta)</li>
<li>[β—‹] = Configurato ma disattivo</li>
<li>[β—‹] Disabilitato = Non configurato (grigio)</li></p><p>---</p><p><h2>βš™οΈ Workflow Completo</h2></p><p><h3><strong>1. Configurazione Iniziale</strong> (Prima Volta)</h3></p><p><h4><strong>Provider 1: OpenAI</strong></h4>
1. Click <strong>&quot;Configura&quot;</strong> su card OpenAI
2. Inserisci API key
3. Scegli modello:
gpt-4o-mini
4. <strong>Salva</strong>
5. Provider salvato ma <strong>NON attivo</strong> ancora</p><p><h4><strong>Provider 2: Claude</strong></h4>
1. Click <strong>&quot;Configura&quot;</strong> su card Claude
2. Inserisci API key Anthropic
3. Scegli modello: </code>claude-3-haiku<code>
4. <strong>Salva</strong>
5. Provider salvato ma <strong>NON attivo</strong></p><p><h4><strong>Provider 3: Gemini</strong></h4>
1. Click <strong>&quot;Configura&quot;</strong> su card Gemini
2. Inserisci API key Google
3. Scegli modello: </code>gemini-1.5-flash<code>
4. <strong>Salva</strong>
5. Provider salvato ma <strong>NON attivo</strong></p><p><strong>Risultato</strong>: 3 provider configurati, <strong>nessuno attivo</strong> ancora</p><p>---</p><p><h3><strong>2. Attivazione Provider</strong></h3></p><p><strong>Modo 1: Radio Button</strong> (nel header card)
</code>`<code>
Click sul radio [β—‹] del provider che vuoi attivare
    ↓
Automaticamente [●] si sposta su quello
    ↓
Provider attivato!
`

Modo 2: Bottone "Attiva" (nel footer card) ` Click "Attiva" sotto la card ↓ Provider si attiva ↓ Card diventa verde con bordo `

</p><p>---</p><p><h3><strong>3. Switch tra Provider</strong></h3></p><p><strong>Scenario</strong>: Hai OpenAI attivo, vuoi passare a Claude</p><p></code>`<code>
OpenAI [●] Attivo (verde)
Claude [β—‹] Configurato</p><p>Click su radio Claude [β—‹]
    ↓
OpenAI [β—‹] si disattiva automaticamente
Claude [●] si attiva
    ↓
Sistema usa Claude per tutte le chiamate successive!
`

Tempo: 1 secondo (nessun reload manuale) βœ…

---

4. Disattiva Tutto

Scenario: Vuoi spegnere AI temporaneamente

` Click "Disattiva Tutto" (in alto a destra) ↓ Tutti i provider [β—‹] disattivati ↓ AI Assistant non funziona (mostra messaggio) `

Utile per:

  • Budget esaurito (blocco temporaneo)
  • Manutenzione
  • Test senza AI
  • ---

    πŸ—„οΈ Database Structure

    3 Record in ai_settings:

    1. Configurazioni Multiple

    `sql setting_key: 'ai_providers_configs' setting_value: { "openai": { "provider": "openai", "api_key": "sk-proj-...", "model": "gpt-4o-mini", "max_tokens": 800, "temperature": 0.3 }, "anthropic": { "provider": "anthropic", "api_key": "sk-ant-...", "model": "claude-3-haiku", "max_tokens": 800, "temperature": 0.3 }, "google": { "provider": "google", "api_key": "AIza...", "model": "gemini-1.5-flash", "max_tokens": 800, "temperature": 0.3 } } `

    2. Provider Attivo

    `sql setting_key: 'ai_active_provider' setting_value: { "active": "openai" // oppure "anthropic", "google", null } `

    3. Budget Limits

    `sql setting_key: 'ai_budget_limits' setting_value: { ... } `

    ---

    πŸ”§ Come Si Usa nel Codice

    Quando serve chiamare AI:

    `php // Service: AiAssistantService.php

    public function callAI($prompt) { // 1. Ottieni provider attivo $activeKey = $this->getActiveProvider(); if (!$activeKey) { throw new Exception('Nessun provider AI attivo'); } // 2. Ottieni configurazione provider $configs = $this->getAllConfigs(); $config = $configs[$activeKey]; // 3. Chiama il provider corretto if ($activeKey === 'openai') { return $this->callOpenAI($config, $prompt); } elseif ($activeKey === 'anthropic') { return $this->callClaude($config, $prompt); } elseif ($activeKey === 'google') { return $this->callGemini($config, $prompt); } }

    protected function getActiveProvider(): ?string { $setting = DB::table('ai_settings') ->where('setting_key', 'ai_active_provider') ->first(); return $setting ? json_decode($setting->setting_value, true)['active'] ?? null : null; } ``

    ---

    βœ… Vantaggi Sistema

    1. FlessibilitΓ  Totale

  • Configura tutti i provider una volta
  • Switch istantaneo tra provider
  • Test A/B facile (oggi OpenAI, domani Claude)
  • 2. Zero Downtime

  • Configurazioni persistenti
  • Switch in tempo reale
  • No riavvio applicazione
  • 3. Backup Automatico

  • Se OpenAI down β†’ Switch a Claude in 1 click
  • Configurazioni giΓ  pronte
  • 4. Cost Optimization

  • OpenAI per qualitΓ  (piΓΉ caro)
  • Gemini per volume (economico)
  • Switch quando serve
  • ---

    πŸ“Š Use Cases Pratici

    Use Case 1: Test & Comparison

    Setup: 1. Configura OpenAI + Claude + Gemini 2. Attiva OpenAI β†’ Genera 5 template 3. Switch a Claude β†’ Rigenera stessi template 4. Switch a Gemini β†’ Rigenera stessi template 5. Confronta risultati

    Tempo: 5 minuti Costo: ~$0.03 (test tutti e 3)

    ---

    Use Case 2: Cost Optimization

    Scenario: Costi OpenAI troppo alti

    1. Vai a Dashboard Costi 2. Vedi: OpenAI $8/mese 3. Switch a Gemini (più economico) 4. Mese dopo: Gemini $2/mese 5. Risparmio: -75% 🎯

    ---

    Use Case 3: Provider Outage

    Scenario: OpenAI down (rate limit, maintenance)

    1. Utenti vedono errori 2. Super-admin: Switch a Claude (1 click) 3. Sistema riprende subito 4. Quando OpenAI torna: Switch back

    Downtime: < 1 minuto βœ…

    ---

    🎯 Stati Provider

    Provider puΓ² essere in 4 stati:

    | Stato | Radio | Badge | Bottoni | |-------|-------|-------|---------| | Non Configurato | [β—‹] Disabilitato | Grigio "Non configurato" | [Configura] | | Configurato Inattivo | [β—‹] Attivo | Blu "Configurato" | [Modifica] [Attiva] | | Attivo | [●] Checked | Verde "Attivo" | [Modifica] | | Tutti OFF | Tutti [β—‹] | - | [Configura] su tutti |

    ---

    ⚑ Quick Actions

    Attiva Provider Veloce

    Dalla card:

  • Click bottone "Attiva" β†’ Attiva immediatamente
  • Oppure click radio [β—‹] β†’ Attiva
  • Entrambi fanno stessa cosa!

    Disattiva Tutto Veloce

    Dalla barra superiore:

  • Click "Disattiva Tutto"
  • Conferma
  • Tutti i provider OFF
  • ---

    πŸ“‹ Checklist Setup

    Prima Configurazione (10 min)

  • [ ] Configura OpenAI (API key + modello)
  • [ ] Configura Claude (opzionale)
  • [ ] Configura Gemini (opzionale)
  • [ ] Attiva 1 provider (radio button)
  • [ ] Verifica badge "Attivo" verde
  • [ ] Test funzionalitΓ  AI
  • Maintenance (quando serve)

  • [ ] Switch provider se necessario
  • [ ] Aggiorna API key se scaduta
  • [ ] Cambia modello se pricing cambia
  • [ ] Disattiva tutto se budget esaurito
  • ---

    Ora il sistema Γ¨ perfetto:

  • βœ… Tutti i provider configurabili indipendentemente
  • βœ… Switch con radio button (solo 1 attivo)
  • βœ… Opzione "Nessuno attivo" (tutti OFF)
  • βœ… Configurazioni persistenti (non sovrascrive)
  • βœ… Modifica senza perdere config
  • βœ… Visual feedback chiaro (colori card)
  • Proprio come volevi! 🎯

    ---

    Prova ora e dimmi se funziona come ti aspettavi! πŸš€

    Analisi Codice

    Blocco 1
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ βœ… Provider Attivo: OpenAI                             β”‚
    β”‚    Modello: gpt-4o-mini | Temp: 0.3 | Tokens: 800    β”‚
    β”‚    [⚑ Disattiva Tutto]                                β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ 🟒 OpenAI        [●] β”‚ β”‚ 🟣 Claude        [β—‹] β”‚ β”‚ πŸ”΅ Gemini        [β—‹] β”‚
    β”‚ Configurato          β”‚ β”‚ Configurato          β”‚ β”‚ Non configurato      β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Modelli:             β”‚ β”‚ Modelli:             β”‚ β”‚ Modelli:             β”‚
    β”‚ β€’ GPT-4o Mini [β˜…]    β”‚ β”‚ β€’ Claude Haiku [β˜…]   β”‚ β”‚ β€’ Gemini Flash [β˜…]   β”‚
    β”‚ β€’ GPT-4o             β”‚ β”‚ β€’ Claude Sonnet      β”‚ β”‚ β€’ Gemini Pro         β”‚
    β”‚                      β”‚ β”‚                      β”‚ β”‚                      β”‚
    β”‚ [Modifica]           β”‚ β”‚ [Modifica] [Attiva]  β”‚ β”‚ [Configura]          β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    
    Blocco 2
    Click sul radio [β—‹] del provider che vuoi attivare
        ↓
    Automaticamente [●] si sposta su quello
        ↓
    Provider attivato!
    
    Blocco 3
    Click "Attiva" sotto la card
        ↓
    Provider si attiva
        ↓
    Card diventa verde con bordo
    
    Blocco 4
    OpenAI [●] Attivo (verde)
    Claude [β—‹] Configurato
    
    Click su radio Claude [β—‹]
        ↓
    OpenAI [β—‹] si disattiva automaticamente
    Claude [●] si attiva
        ↓
    Sistema usa Claude per tutte le chiamate successive!
    
    Blocco 5
    Click "Disattiva Tutto" (in alto a destra)
        ↓
    Tutti i provider [β—‹] disattivati
        ↓
    AI Assistant non funziona (mostra messaggio)
    
    Blocco 6 sql
    setting_key: 'ai_providers_configs'
    setting_value: {
      "openai": {
        "provider": "openai",
        "api_key": "sk-proj-...",
        "model": "gpt-4o-mini",
        "max_tokens": 800,
        "temperature": 0.3
      },
      "anthropic": {
        "provider": "anthropic",
        "api_key": "sk-ant-...",
        "model": "claude-3-haiku",
        "max_tokens": 800,
        "temperature": 0.3
      },
      "google": {
        "provider": "google",
        "api_key": "AIza...",
        "model": "gemini-1.5-flash",
        "max_tokens": 800,
        "temperature": 0.3
      }
    }
    
    Blocco 7 sql
    setting_key: 'ai_active_provider'
    setting_value: {
      "active": "openai"  // oppure "anthropic", "google", null
    }
    
    Blocco 8 sql
    setting_key: 'ai_budget_limits'
    setting_value: { ... }
    
    Blocco 9 php
    // Service: AiAssistantService.php
    
    public function callAI($prompt) {
        // 1. Ottieni provider attivo
        $activeKey = $this->getActiveProvider();
        
        if (!$activeKey) {
            throw new Exception('Nessun provider AI attivo');
        }
        
        // 2. Ottieni configurazione provider
        $configs = $this->getAllConfigs();
        $config = $configs[$activeKey];
        
        // 3. Chiama il provider corretto
        if ($activeKey === 'openai') {
            return $this->callOpenAI($config, $prompt);
        } elseif ($activeKey === 'anthropic') {
            return $this->callClaude($config, $prompt);
        } elseif ($activeKey === 'google') {
            return $this->callGemini($config, $prompt);
        }
    }
    
    protected function getActiveProvider(): ?string {
        $setting = DB::table('ai_settings')
            ->where('setting_key', 'ai_active_provider')
            ->first();
        
        return $setting 
            ? json_decode($setting->setting_value, true)['active'] ?? null
            : null;
    }