diff --git a/assets/js/chatbot_settings.js b/assets/js/chatbot_settings.js index 3e888f8..5ac7001 100644 --- a/assets/js/chatbot_settings.js +++ b/assets/js/chatbot_settings.js @@ -28,13 +28,13 @@ function openAddKeyModal(provider = null) { document.getElementById('keyAction').value = 'add'; editMode = false; + // Important : activer le select AVANT de définir la valeur + providerSelect.disabled = false; + // Pre-select provider if provided if (provider) { providerSelect.value = provider; - updateModelsList(); - providerSelect.disabled = false; - } else { - providerSelect.disabled = false; + providerSelect.dispatchEvent(new Event('change')); // Trigger updateModelsList } title.textContent = 'Ajouter une clé API'; @@ -282,6 +282,98 @@ function deleteKey(provider) { }); } +// ========== Set Default Provider ========== + +function setAsDefault(provider, model) { + const formData = new FormData(); + formData.append('action', 'set_default'); + formData.append('provider', provider); + formData.append('model', model); + + fetch('chatbot_api_ajax.php', { + method: 'POST', + body: formData + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + showToast(data.message || 'Provider par défaut mis à jour', 'success'); + setTimeout(() => { + window.location.reload(); + }, 1000); + } else { + showToast(data.error || 'Erreur', 'error'); + } + }) + .catch(error => { + console.error('Error:', error); + showToast('Erreur de connexion', 'error'); + }); +} + +// ========== Configure Ollama ========== + +function configureOllama() { + const availableModels = models['ollama'] || []; + + if (availableModels.length === 0) { + showToast('Aucun modèle Ollama disponible', 'error'); + return; + } + + // Créer une liste des modèles + let modelOptions = ''; + + // Simple prompt + const modelHtml = ` +
+

Choisir le modèle Ollama par défaut :

+ ${modelOptions} +
+ `; + + // Utiliser une confirm box simple pour l'instant + // (dans une vraie app, utiliser le modal existant) + const modal = document.getElementById('keyModal'); + const modalContent = modal.querySelector('.modal-content'); + const originalContent = modalContent.innerHTML; + + modalContent.innerHTML = ` + +
+

Choisir le modèle Ollama à utiliser par défaut :

+ +
+ + +
+
+ `; + + modal.classList.add('show'); +} + +function saveOllamaConfig() { + const select = document.getElementById('ollama-model-select'); + const model = select.value; + + if (!model) { + showToast('Veuillez sélectionner un modèle', 'error'); + return; + } + + setAsDefault('ollama', model); +} + // ========== Toast Notifications ========== function showToast(message, type = 'info') { diff --git a/enseignant/chatbot_api_ajax.php b/enseignant/chatbot_api_ajax.php index 94978bd..bd88067 100644 --- a/enseignant/chatbot_api_ajax.php +++ b/enseignant/chatbot_api_ajax.php @@ -161,6 +161,35 @@ try { ]); break; + case 'set_default': + // Définir le provider par défaut + $provider = $_POST['provider'] ?? null; + $model = $_POST['model'] ?? null; + + if (!$provider || !$model) { + throw new Exception('Paramètres manquants'); + } + + $db = Database::getInstance(); + + // Upsert dans chatbot_default_provider + $result = $db->query( + "INSERT INTO chatbot_default_provider (id_enseignant, provider, model_default) + VALUES (?, ?, ?) + ON DUPLICATE KEY UPDATE provider = VALUES(provider), model_default = VALUES(model_default)", + [$user['id_utilisateur'], $provider, $model] + ); + + if (!$result) { + throw new Exception('Erreur lors de la mise à jour'); + } + + echo json_encode([ + 'success' => true, + 'message' => 'Provider par défaut mis à jour' + ]); + break; + case 'stats': // Récupérer les statistiques d'utilisation $db = Database::getInstance(); diff --git a/enseignant/chatbot_api_settings.php b/enseignant/chatbot_api_settings.php index 6cf5374..f663fb0 100644 --- a/enseignant/chatbot_api_settings.php +++ b/enseignant/chatbot_api_settings.php @@ -21,19 +21,23 @@ $db = Database::getInstance(); // Récupérer les clés API de l'enseignant $api_keys = APIKeyManager::listKeys($user['id_utilisateur']); -// Déterminer le provider par défaut (premier actif ou ollama) -$default_provider = null; -foreach ($api_keys as $key) { - if ($key['is_active']) { - $default_provider = $key['provider']; - break; // Premier actif trouvé - } -} -// Si aucune clé active, Ollama par défaut -if (!$default_provider) { - $default_provider = 'ollama'; +// Récupérer le provider par défaut configuré +$default_config = $db->fetchOne( + "SELECT provider, model_default FROM chatbot_default_provider WHERE id_enseignant = ?", + [$user['id_utilisateur']] +); + +// Si pas de config, initialiser avec Ollama +if (!$default_config) { + $db->query( + "INSERT INTO chatbot_default_provider (id_enseignant, provider, model_default) VALUES (?, 'ollama', 'ministral-3:3b')", + [$user['id_utilisateur']] + ); + $default_config = ['provider' => 'ollama', 'model_default' => 'ministral-3:3b']; } +$default_provider = $default_config['provider']; +$default_model = $default_config['model_default']; // Récupérer les modèles disponibles groupés par provider $models_by_provider = []; @@ -165,10 +169,7 @@ $stats_detail = $db->fetchAll(
- 🟢 Active - - ✨ Par défaut - + 🟢 Active 🟠 Désactivée @@ -178,7 +179,36 @@ $stats_detail = $db->fetchAll(
- + + +
+
+ Type : + 🏠 Local (Jetson) +
+
+ Modèle actuel : + +
+
+ Coût : + Gratuit ✅ +
+
+
+ + + + + +
+
Modèle par défaut : @@ -209,6 +239,11 @@ $stats_detail = $db->fetchAll( + + + diff --git a/sql/chatbot_default_provider.sql b/sql/chatbot_default_provider.sql new file mode 100644 index 0000000..088df20 --- /dev/null +++ b/sql/chatbot_default_provider.sql @@ -0,0 +1,36 @@ +-- ============================================ +-- WebVal - Configuration provider par défaut +-- Table pour stocker le choix de l'enseignant +-- ============================================ + +-- Table de configuration par défaut par enseignant +CREATE TABLE IF NOT EXISTS chatbot_default_provider ( + id INT AUTO_INCREMENT PRIMARY KEY, + id_enseignant INT NOT NULL, + provider VARCHAR(50) NOT NULL, + model_default VARCHAR(100) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (id_enseignant) REFERENCES utilisateurs(id_utilisateur) ON DELETE CASCADE, + UNIQUE KEY unique_enseignant (id_enseignant) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- Initialiser Ollama comme défaut pour les enseignants existants +INSERT IGNORE INTO chatbot_default_provider (id_enseignant, provider, model_default) +SELECT DISTINCT id_utilisateur, 'ollama', 'ministral-3:3b' +FROM utilisateurs +WHERE id_type = 1; -- Type enseignant + +-- Mettre à jour pour ceux qui ont déjà une clé cloud active +UPDATE chatbot_default_provider cdp +JOIN ( + SELECT id_enseignant, provider, model_default + FROM api_keys + WHERE is_active = 1 + ORDER BY created_at ASC + LIMIT 1 +) ak ON cdp.id_enseignant = ak.id_enseignant +SET cdp.provider = ak.provider, + cdp.model_default = ak.model_default; + +SELECT '✅ Table chatbot_default_provider créée et initialisée' as Status;