|
|
<!DOCTYPE html> |
|
|
<html> |
|
|
<head> |
|
|
<title>Test Frontend</title> |
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/4.3.0/marked.min.js"></script> |
|
|
</head> |
|
|
<body> |
|
|
<h1>Test du streaming comme le frontend réel</h1> |
|
|
<button onclick="testStream()">Tester le stream</button> |
|
|
<div id="messages" style="border: 1px solid black; padding: 10px; min-height: 200px;"></div> |
|
|
<div id="output"></div> |
|
|
|
|
|
<script> |
|
|
marked.setOptions({ |
|
|
breaks: true, |
|
|
gfm: true |
|
|
}); |
|
|
|
|
|
function addMessage(role, content) { |
|
|
console.log('addMessage called with role:', role, 'content:', content); |
|
|
const messagesContainer = document.getElementById('messages'); |
|
|
const messageDiv = document.createElement('div'); |
|
|
|
|
|
let messageContent = ''; |
|
|
|
|
|
|
|
|
const markdownHtml = marked.parse(content || ''); |
|
|
messageContent += `<div class="markdown-content">${markdownHtml}</div>`; |
|
|
console.log('Message content HTML:', messageContent); |
|
|
|
|
|
if (role === 'user') { |
|
|
messageDiv.style.cssText = 'max-width: 85%; padding: 1rem; background: #4a5568; color: #f7fafc; margin: 0.5rem 0; border-radius: 1rem; margin-left: auto; margin-right: 0;'; |
|
|
} else { |
|
|
messageDiv.style.cssText = 'max-width: 85%; padding: 1rem; background: #2d3748; color: #e2e8f0; margin: 0.5rem 0; border-radius: 1rem; margin-right: auto; margin-left: 0;'; |
|
|
} |
|
|
|
|
|
messageDiv.innerHTML = messageContent; |
|
|
console.log('Message div created:', messageDiv); |
|
|
|
|
|
messagesContainer.appendChild(messageDiv); |
|
|
return messageDiv; |
|
|
} |
|
|
|
|
|
function testStream() { |
|
|
const output = document.getElementById('output'); |
|
|
output.innerHTML = 'Connexion...<br>'; |
|
|
|
|
|
fetch('http://localhost:5000/chat', { |
|
|
method: 'POST', |
|
|
headers: { 'Content-Type': 'application/json' }, |
|
|
body: JSON.stringify({ |
|
|
message: 'Bonjour', |
|
|
thinking_enabled: true, |
|
|
conversation_id: 'test' |
|
|
}) |
|
|
}) |
|
|
.then(response => { |
|
|
if (!response.ok) { |
|
|
throw new Error(`Erreur: ${response.status}`); |
|
|
} |
|
|
|
|
|
const reader = response.body.getReader(); |
|
|
const decoder = new TextDecoder(); |
|
|
let buffer = ''; |
|
|
let messageElement = null; |
|
|
let messageContent = ''; |
|
|
|
|
|
function processStream() { |
|
|
return reader.read().then(({ done, value }) => { |
|
|
if (done) { |
|
|
output.innerHTML += 'Stream terminé<br>'; |
|
|
return; |
|
|
} |
|
|
|
|
|
buffer += decoder.decode(value, { stream: true }); |
|
|
const lines = buffer.split('\n'); |
|
|
buffer = lines.pop() || ''; |
|
|
|
|
|
for (const line of lines) { |
|
|
output.innerHTML += `Ligne: ${line}<br>`; |
|
|
if (line.startsWith('data: ')) { |
|
|
try { |
|
|
const data = JSON.parse(line.substring(6)); |
|
|
output.innerHTML += `Données: ${JSON.stringify(data)}<br>`; |
|
|
console.log('Received data:', data); |
|
|
|
|
|
if (data.type === 'text') { |
|
|
console.log('Processing text:', data.content); |
|
|
messageContent += data.content; |
|
|
if (!messageElement) { |
|
|
messageElement = addMessage('assistant', ''); |
|
|
console.log('Created message element:', messageElement); |
|
|
} |
|
|
|
|
|
const markdownHtml = marked.parse(messageContent); |
|
|
const markdownElement = messageElement.querySelector('.markdown-content'); |
|
|
if (markdownElement) { |
|
|
markdownElement.innerHTML = markdownHtml; |
|
|
console.log('Updated markdown content'); |
|
|
output.innerHTML += `Contenu mis à jour: ${messageContent}<br>`; |
|
|
} else { |
|
|
console.error('No .markdown-content element found'); |
|
|
output.innerHTML += `ERREUR: Pas d'élément .markdown-content trouvé<br>`; |
|
|
} |
|
|
} else if (data.type === 'end') { |
|
|
output.innerHTML += 'Fin du stream<br>'; |
|
|
return; |
|
|
} |
|
|
} catch (e) { |
|
|
output.innerHTML += `Erreur parsing: ${e}<br>`; |
|
|
console.error('Erreur parsing JSON:', e, "Ligne reçue:", line); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
return processStream(); |
|
|
}); |
|
|
} |
|
|
|
|
|
return processStream(); |
|
|
}) |
|
|
.catch(error => { |
|
|
output.innerHTML += `Erreur: ${error.message}<br>`; |
|
|
}); |
|
|
} |
|
|
</script> |
|
|
</body> |
|
|
</html> |