230 lines
7.6 KiB
PHP
230 lines
7.6 KiB
PHP
<?php
|
|
/**
|
|
* API AJAX pour la gestion des clés API du chatbot
|
|
* Actions : save, test, delete, get
|
|
*/
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
require_once '../config/config.php';
|
|
require_once '../config/database.php';
|
|
require_once '../config/session.php';
|
|
require_once '../config/api_key_manager.php';
|
|
|
|
// Vérifier authentification
|
|
if (!SessionManager::isLoggedIn() || !SessionManager::isEnseignant()) {
|
|
echo json_encode(['error' => 'Non autorisé']);
|
|
exit;
|
|
}
|
|
|
|
$user = SessionManager::getUser();
|
|
$action = $_GET['action'] ?? $_POST['action'] ?? null;
|
|
|
|
try {
|
|
switch ($action) {
|
|
|
|
case 'save':
|
|
// Sauvegarder une clé API
|
|
$provider = $_POST['provider'] ?? null;
|
|
$api_key = $_POST['api_key'] ?? null;
|
|
$model_default = $_POST['model_default'] ?? null;
|
|
$quota_max = !empty($_POST['quota_max']) ? (int)$_POST['quota_max'] : null;
|
|
|
|
if (!$provider || !$api_key || !$model_default) {
|
|
throw new Exception('Paramètres manquants');
|
|
}
|
|
|
|
// Valider le provider
|
|
$valid_providers = ['gemini', 'mistral', 'openai', 'ollama'];
|
|
if (!in_array($provider, $valid_providers)) {
|
|
throw new Exception('Provider invalide');
|
|
}
|
|
|
|
// Sauvegarder
|
|
$result = APIKeyManager::saveKey(
|
|
$user['id_utilisateur'],
|
|
$provider,
|
|
$api_key,
|
|
$model_default
|
|
);
|
|
|
|
if (!$result) {
|
|
throw new Exception('Erreur lors de la sauvegarde');
|
|
}
|
|
|
|
// Mettre à jour le quota si défini
|
|
if ($quota_max !== null) {
|
|
$db = Database::getInstance();
|
|
$db->query(
|
|
"UPDATE api_keys SET quota_max = ? WHERE id_enseignant = ? AND provider = ?",
|
|
[$quota_max, $user['id_utilisateur'], $provider]
|
|
);
|
|
}
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => 'Clé API enregistrée avec succès'
|
|
]);
|
|
break;
|
|
|
|
case 'test':
|
|
// Tester une connexion API
|
|
$provider = $_POST['provider'] ?? null;
|
|
$api_key = $_POST['api_key'] ?? null;
|
|
$model = $_POST['model'] ?? null;
|
|
|
|
if (!$provider) {
|
|
throw new Exception('Provider manquant');
|
|
}
|
|
|
|
// Si pas de clé fournie, récupérer celle enregistrée
|
|
if (!$api_key) {
|
|
$key_data = APIKeyManager::getKey($user['id_utilisateur'], $provider);
|
|
if (!$key_data) {
|
|
throw new Exception('Aucune clé enregistrée pour ce provider');
|
|
}
|
|
$api_key = $key_data['api_key'];
|
|
$model = $model ?? $key_data['model_default'];
|
|
}
|
|
|
|
// Tester la connexion
|
|
$result = APIKeyManager::testConnection($provider, $api_key, $model);
|
|
|
|
echo json_encode($result);
|
|
break;
|
|
|
|
case 'delete':
|
|
// Supprimer une clé API
|
|
$provider = $_POST['provider'] ?? null;
|
|
|
|
if (!$provider) {
|
|
throw new Exception('Provider manquant');
|
|
}
|
|
|
|
$result = APIKeyManager::deleteKey($user['id_utilisateur'], $provider);
|
|
|
|
if (!$result) {
|
|
throw new Exception('Erreur lors de la suppression');
|
|
}
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => 'Clé API supprimée'
|
|
]);
|
|
break;
|
|
|
|
case 'get':
|
|
// Récupérer une clé API (pour édition)
|
|
$provider = $_GET['provider'] ?? null;
|
|
|
|
if (!$provider) {
|
|
throw new Exception('Provider manquant');
|
|
}
|
|
|
|
$db = Database::getInstance();
|
|
$key_data = $db->fetchOne(
|
|
"SELECT provider, model_default, quota_max, is_active
|
|
FROM api_keys
|
|
WHERE id_enseignant = ? AND provider = ?",
|
|
[$user['id_utilisateur'], $provider]
|
|
);
|
|
|
|
if (!$key_data) {
|
|
throw new Exception('Clé non trouvée');
|
|
}
|
|
|
|
// Ne pas retourner la clé API elle-même
|
|
echo json_encode([
|
|
'success' => true,
|
|
'data' => $key_data
|
|
]);
|
|
break;
|
|
|
|
case 'toggle':
|
|
// Activer/désactiver une clé
|
|
$provider = $_POST['provider'] ?? null;
|
|
$active = isset($_POST['active']) ? (bool)$_POST['active'] : null;
|
|
|
|
if (!$provider || $active === null) {
|
|
throw new Exception('Paramètres manquants');
|
|
}
|
|
|
|
$db = Database::getInstance();
|
|
$result = $db->query(
|
|
"UPDATE api_keys SET is_active = ? WHERE id_enseignant = ? AND provider = ?",
|
|
[$active, $user['id_utilisateur'], $provider]
|
|
);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => $active ? 'Clé activée' : 'Clé désactivée'
|
|
]);
|
|
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();
|
|
|
|
$stats = $db->fetchAll(
|
|
"SELECT
|
|
provider,
|
|
model_used,
|
|
SUM(total_conversations) as conversations,
|
|
SUM(total_messages) as messages,
|
|
AVG(avg_response_time_ms) as avg_latency,
|
|
month
|
|
FROM v_chatbot_usage_stats
|
|
WHERE id_enseignant = ?
|
|
GROUP BY provider, model_used, month
|
|
ORDER BY month DESC, conversations DESC
|
|
LIMIT 50",
|
|
[$user['id_utilisateur']]
|
|
);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'stats' => $stats
|
|
]);
|
|
break;
|
|
|
|
default:
|
|
throw new Exception('Action inconnue');
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'error' => $e->getMessage()
|
|
]);
|
|
}
|