Update static/index.html
Browse files- static/index.html +48 -3
static/index.html
CHANGED
@@ -55,6 +55,12 @@
|
|
55 |
<h2>Client WebSocket pour API Mock</h2>
|
56 |
<div id="status" class="disconnected">Déconnecté</div>
|
57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
<h3>Logs de Communication :</h3>
|
59 |
<ul id="logs">
|
60 |
<li>En attente de connexion...</li>
|
@@ -65,21 +71,30 @@
|
|
65 |
const statusDiv = document.getElementById('status');
|
66 |
const logsList = document.getElementById('logs');
|
67 |
let ws;
|
|
|
68 |
function addLog(message) {
|
69 |
const li = document.createElement('li');
|
70 |
li.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
|
71 |
logsList.appendChild(li);
|
72 |
logsList.scrollTop = logsList.scrollHeight; // Auto-scroll
|
73 |
}
|
|
|
74 |
// OpenAI API Call for private mode
|
75 |
async function callOpenAI(prompt) {
|
76 |
console.log('prompt:', prompt)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
77 |
try {
|
78 |
const response = await fetch('https://llm.synapse.thalescloud.io/v1/chat/completions', {
|
79 |
method: 'POST',
|
80 |
headers: {
|
81 |
'Content-Type': 'application/json',
|
82 |
-
'Authorization': `Bearer
|
83 |
},
|
84 |
body: JSON.stringify({
|
85 |
model: 'gemini-2.5-pro',
|
@@ -92,6 +107,7 @@
|
|
92 |
temperature: 0.7
|
93 |
})
|
94 |
});
|
|
|
95 |
console.log('response:', response)
|
96 |
if (!response.ok) {
|
97 |
throw new Error(`OpenAI API error: ${response.status}`);
|
@@ -105,29 +121,56 @@
|
|
105 |
throw error;
|
106 |
}
|
107 |
}
|
|
|
108 |
function connect() {
|
109 |
// Adapte le protocole (ws ou wss pour le sécurisé)
|
110 |
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
111 |
const wsUrl = `${protocol}//${window.location.host}/ws`;
|
112 |
ws = new WebSocket(wsUrl);
|
|
|
113 |
ws.onopen = function() {
|
114 |
statusDiv.textContent = 'Connecté';
|
115 |
statusDiv.className = 'connected';
|
116 |
addLog('Connexion WebSocket établie.');
|
117 |
};
|
|
|
|
|
118 |
ws.onmessage = async function(event) {
|
119 |
const messageFromServer = event.data;
|
120 |
console.log(`Message reçu du serveur : "${messageFromServer}"`)
|
121 |
addLog(`Message reçu du serveur : "${messageFromServer}"`);
|
122 |
|
123 |
try {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
const responsePhrase = await callOpenAI(messageFromServer);
|
125 |
-
|
126 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
} catch (error) {
|
|
|
128 |
addLog(`Erreur lors de l'appel API : ${error.message}`);
|
|
|
|
|
|
|
|
|
|
|
129 |
}
|
130 |
};
|
|
|
131 |
ws.onclose = function() {
|
132 |
statusDiv.textContent = 'Déconnecté';
|
133 |
statusDiv.className = 'disconnected';
|
@@ -135,12 +178,14 @@
|
|
135 |
// Tente de se reconnecter après 3 secondes
|
136 |
setTimeout(connect, 3000);
|
137 |
};
|
|
|
138 |
ws.onerror = function(error) {
|
139 |
addLog('Erreur WebSocket.');
|
140 |
console.error('WebSocket Error:', error);
|
141 |
ws.close();
|
142 |
};
|
143 |
}
|
|
|
144 |
// Lance la connexion au chargement de la page
|
145 |
connect();
|
146 |
</script>
|
|
|
55 |
<h2>Client WebSocket pour API Mock</h2>
|
56 |
<div id="status" class="disconnected">Déconnecté</div>
|
57 |
|
58 |
+
<div style="margin-bottom: 20px;">
|
59 |
+
<label for="apiKey" style="display: block; margin-bottom: 5px; font-weight: bold;">Clé API :</label>
|
60 |
+
<input type="password" id="apiKey" placeholder="Entrez votre clé API..." style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
|
61 |
+
<small style="color: #666; font-size: 12px;">La clé est stockée uniquement dans votre navigateur pour cette session.</small>
|
62 |
+
</div>
|
63 |
+
|
64 |
<h3>Logs de Communication :</h3>
|
65 |
<ul id="logs">
|
66 |
<li>En attente de connexion...</li>
|
|
|
71 |
const statusDiv = document.getElementById('status');
|
72 |
const logsList = document.getElementById('logs');
|
73 |
let ws;
|
74 |
+
|
75 |
function addLog(message) {
|
76 |
const li = document.createElement('li');
|
77 |
li.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
|
78 |
logsList.appendChild(li);
|
79 |
logsList.scrollTop = logsList.scrollHeight; // Auto-scroll
|
80 |
}
|
81 |
+
|
82 |
// OpenAI API Call for private mode
|
83 |
async function callOpenAI(prompt) {
|
84 |
console.log('prompt:', prompt)
|
85 |
+
|
86 |
+
// Récupérer la clé API depuis l'input
|
87 |
+
const apiKey = document.getElementById('apiKey').value.trim();
|
88 |
+
if (!apiKey) {
|
89 |
+
throw new Error('Clé API manquante. Veuillez la saisir dans le champ prévu.');
|
90 |
+
}
|
91 |
+
|
92 |
try {
|
93 |
const response = await fetch('https://llm.synapse.thalescloud.io/v1/chat/completions', {
|
94 |
method: 'POST',
|
95 |
headers: {
|
96 |
'Content-Type': 'application/json',
|
97 |
+
'Authorization': `Bearer ${apiKey}`
|
98 |
},
|
99 |
body: JSON.stringify({
|
100 |
model: 'gemini-2.5-pro',
|
|
|
107 |
temperature: 0.7
|
108 |
})
|
109 |
});
|
110 |
+
|
111 |
console.log('response:', response)
|
112 |
if (!response.ok) {
|
113 |
throw new Error(`OpenAI API error: ${response.status}`);
|
|
|
121 |
throw error;
|
122 |
}
|
123 |
}
|
124 |
+
|
125 |
function connect() {
|
126 |
// Adapte le protocole (ws ou wss pour le sécurisé)
|
127 |
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
128 |
const wsUrl = `${protocol}//${window.location.host}/ws`;
|
129 |
ws = new WebSocket(wsUrl);
|
130 |
+
|
131 |
ws.onopen = function() {
|
132 |
statusDiv.textContent = 'Connecté';
|
133 |
statusDiv.className = 'connected';
|
134 |
addLog('Connexion WebSocket établie.');
|
135 |
};
|
136 |
+
|
137 |
+
// CORRECTION PRINCIPALE : Rendre onmessage async et ajouter gestion d'erreur
|
138 |
ws.onmessage = async function(event) {
|
139 |
const messageFromServer = event.data;
|
140 |
console.log(`Message reçu du serveur : "${messageFromServer}"`)
|
141 |
addLog(`Message reçu du serveur : "${messageFromServer}"`);
|
142 |
|
143 |
try {
|
144 |
+
// Vérifier que la connexion est encore ouverte
|
145 |
+
if (ws.readyState !== WebSocket.OPEN) {
|
146 |
+
addLog('Erreur: WebSocket fermé, impossible de répondre');
|
147 |
+
return;
|
148 |
+
}
|
149 |
+
|
150 |
+
addLog('Appel API en cours...');
|
151 |
+
|
152 |
+
// CORRECTION : Utiliser await pour attendre la réponse
|
153 |
const responsePhrase = await callOpenAI(messageFromServer);
|
154 |
+
|
155 |
+
// Vérifier à nouveau que la connexion est ouverte
|
156 |
+
if (ws.readyState === WebSocket.OPEN) {
|
157 |
+
addLog(`Envoi de la réponse automatique : "${responsePhrase}"`);
|
158 |
+
ws.send(responsePhrase);
|
159 |
+
} else {
|
160 |
+
addLog('Erreur: WebSocket fermé pendant l\'appel API');
|
161 |
+
}
|
162 |
+
|
163 |
} catch (error) {
|
164 |
+
console.error('Erreur lors de l\'appel API:', error);
|
165 |
addLog(`Erreur lors de l'appel API : ${error.message}`);
|
166 |
+
|
167 |
+
// Envoyer un message d'erreur au serveur pour éviter le timeout
|
168 |
+
if (ws.readyState === WebSocket.OPEN) {
|
169 |
+
ws.send(`Erreur: ${error.message}`);
|
170 |
+
}
|
171 |
}
|
172 |
};
|
173 |
+
|
174 |
ws.onclose = function() {
|
175 |
statusDiv.textContent = 'Déconnecté';
|
176 |
statusDiv.className = 'disconnected';
|
|
|
178 |
// Tente de se reconnecter après 3 secondes
|
179 |
setTimeout(connect, 3000);
|
180 |
};
|
181 |
+
|
182 |
ws.onerror = function(error) {
|
183 |
addLog('Erreur WebSocket.');
|
184 |
console.error('WebSocket Error:', error);
|
185 |
ws.close();
|
186 |
};
|
187 |
}
|
188 |
+
|
189 |
// Lance la connexion au chargement de la page
|
190 |
connect();
|
191 |
</script>
|