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>"Configura"</strong> su card OpenAI 2. Inserisci API key 3. Scegli modello:
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>"Configura"</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>"Configura"</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.phppublic 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
2. Zero Downtime
3. Backup Automatico
4. Cost Optimization
---
π 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:
Entrambi fanno stessa cosa!
Disattiva Tutto Veloce
Dalla barra superiore:
---
π Checklist Setup
Prima Configurazione (10 min)
Maintenance (quando serve)
---
β RIEPILOGO
Ora il sistema Γ¨ perfetto:
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;
}