169 lines
6.7 KiB
HTML
169 lines
6.7 KiB
HTML
<!DOCTYPE html>
|
|
<html><head><meta charset="utf-8"><title>PROOF WAVE-268</title>
|
|
<style>
|
|
body{font-family:-apple-system,Segoe UI,monospace;background:#0b0d15;color:#e2e8f0;padding:30px;font-size:14px;margin:0;min-height:100vh}
|
|
.box{background:#1e293b;padding:18px;border:2px solid #10b981;border-radius:10px;margin:12px 0}
|
|
.box.fail{border-color:#ef4444}
|
|
.key{color:#06b6d4;font-weight:700;font-size:12px}
|
|
.val{color:#fff}
|
|
h1{color:#f59e0b;margin:0 0 20px 0}
|
|
.btn{background:linear-gradient(135deg,#10b981,#06b6d4);color:#000;border:0;padding:14px 28px;font-size:16px;font-weight:800;border-radius:10px;cursor:pointer;box-shadow:0 4px 14px rgba(16,185,129,0.4)}
|
|
.btn:hover{transform:scale(1.02)}
|
|
.btn:disabled{opacity:.5;cursor:wait}
|
|
pre{color:#fff;white-space:pre-wrap;margin:6px 0 0 0;font-size:12px;max-height:300px;overflow:auto;background:#0f172a;padding:10px;border-radius:6px}
|
|
.ok{color:#10b981;font-weight:700}
|
|
.nok{color:#ef4444;font-weight:700}
|
|
#loader{display:none;color:#06b6d4;margin-top:20px;font-weight:700}
|
|
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-144055 -->
|
|
<style id="doctrine60-ux-direct">
|
|
|
|
/* DOCTRINE-60-UX-ENRICH injected-direct */
|
|
body::before {
|
|
content: '';
|
|
position: fixed;
|
|
top: 0; left: 0; width: 100vw; height: 100vh;
|
|
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
|
|
pointer-events: none;
|
|
z-index: -1;
|
|
}
|
|
.card, .kpi, .panel, .btn {
|
|
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
|
|
}
|
|
.card:hover, .kpi:hover, .panel:hover {
|
|
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
|
|
border-color: rgba(100,180,255,0.5);
|
|
}
|
|
@keyframes pulseD60 {
|
|
0%,100% { opacity: 1; transform: scale(1); }
|
|
50% { opacity: 0.7; transform: scale(1.05); }
|
|
}
|
|
.pulse, .live-indicator, .active, .online {
|
|
animation: pulseD60 3s ease-in-out infinite;
|
|
}
|
|
.modal, .chat, .speech, .overlay {
|
|
backdrop-filter: blur(12px);
|
|
-webkit-backdrop-filter: blur(12px);
|
|
}
|
|
.enter-stagger {
|
|
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
|
|
}
|
|
@keyframes enterStagD60 {
|
|
from { opacity: 0; transform: translateY(20px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>WAVE-268 PROOF TEST LIVE</h1>
|
|
<p style="color:#94a3b8">Teste directement depuis ton navigateur vers le backend WEVIA. Aucun cache, aucun intermediaire.</p>
|
|
<button id="runbtn" class="btn" onclick="runTests()">LANCER LES 5 TESTS LIVE</button>
|
|
<div id="loader">Running tests...</div>
|
|
<div id="results"></div>
|
|
<script>
|
|
async function runTests() {
|
|
var btn = document.getElementById("runbtn");
|
|
btn.disabled = true;
|
|
document.getElementById("loader").style.display = "block";
|
|
var res = document.getElementById("results");
|
|
res.innerHTML = "";
|
|
|
|
var cmds = [
|
|
"intents_pool",
|
|
"quelle heure",
|
|
"multiagent parallele: nonreg + l99 + git",
|
|
"orchestrate en parallele: ping + nonreg",
|
|
"cable un intent pour donner date quand on dit date_now. Commande: date"
|
|
];
|
|
|
|
for (var i = 0; i < cmds.length; i++) {
|
|
var cmd = cmds[i];
|
|
var t0 = Date.now();
|
|
var answer = "";
|
|
var engine = "";
|
|
var rawSample = "";
|
|
var status = "FAIL";
|
|
var err = "";
|
|
|
|
try {
|
|
var r = await fetch("/api/wevia-master-api.php", {
|
|
method: "POST",
|
|
headers: {"Content-Type": "application/json"},
|
|
body: JSON.stringify({message: cmd, session: "proof-" + Date.now()})
|
|
});
|
|
var txt = await r.text();
|
|
rawSample = txt.substring(0, 300);
|
|
|
|
// Try parse JSON direct
|
|
try {
|
|
var j = JSON.parse(txt);
|
|
answer = j.content || j.response || j.text || "";
|
|
engine = j.tool || j.engine || j.provider || "";
|
|
} catch(e) {
|
|
// Try parse SSE lines
|
|
var lines = txt.split("\n");
|
|
for (var k = 0; k < lines.length; k++) {
|
|
var line = lines[k];
|
|
if (line.indexOf("data: ") === 0) {
|
|
try {
|
|
var d = JSON.parse(line.substring(6));
|
|
if ((d.type === "answer" || d.type === "chunk") && d.text) {
|
|
answer = d.text;
|
|
engine = d.engine || "";
|
|
break;
|
|
}
|
|
} catch(e2) {}
|
|
}
|
|
}
|
|
}
|
|
|
|
var isFake = answer.toLowerCase().indexOf("intent shell reel") >= 0
|
|
|| answer.indexOf("Soutien technique") >= 0
|
|
|| answer.indexOf("Conseils d'affaires") >= 0;
|
|
status = answer ? (isFake ? "FAKE/LLM" : "REAL") : "EMPTY";
|
|
} catch(e) {
|
|
err = e.message;
|
|
status = "ERR";
|
|
}
|
|
|
|
var elapsed = Date.now() - t0;
|
|
var boxClass = (status === "REAL") ? "box" : "box fail";
|
|
var statusClass = (status === "REAL") ? "ok" : "nok";
|
|
|
|
var html = '<div class="' + boxClass + '">';
|
|
html += '<div><span class="key">CMD:</span> <span class="val">' + cmd + '</span></div>';
|
|
html += '<div><span class="key">STATUS:</span> <span class="' + statusClass + '">' + status + '</span></div>';
|
|
html += '<div><span class="key">ENGINE:</span> <span class="val">' + (engine || "?") + '</span></div>';
|
|
html += '<div><span class="key">TIME:</span> <span class="val">' + elapsed + 'ms</span></div>';
|
|
if (err) html += '<div><span class="key">ERR:</span> <span class="val">' + err + '</span></div>';
|
|
if (answer) html += '<div><span class="key">ANSWER:</span></div><pre>' + answer.substring(0,800).replace(/</g,"<") + '</pre>';
|
|
if (!answer) html += '<div><span class="key">RAW:</span></div><pre>' + rawSample.replace(/</g,"<") + '</pre>';
|
|
html += '</div>';
|
|
|
|
res.innerHTML += html;
|
|
}
|
|
|
|
res.innerHTML += '<div class="box" style="border-color:#f59e0b"><b>Tests termines</b> - ' + new Date().toLocaleString("fr-FR") + '</div>';
|
|
|
|
document.getElementById("loader").style.display = "none";
|
|
btn.disabled = false;
|
|
}
|
|
</script>
|
|
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
|
|
|
|
// DOCTRINE-60-UX-JS staggered entrance
|
|
(function(){
|
|
if (!('IntersectionObserver' in window)) return;
|
|
const obs = new IntersectionObserver((entries) => {
|
|
entries.forEach((e, i) => {
|
|
if (e.isIntersecting) {
|
|
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
|
|
obs.unobserve(e.target);
|
|
}
|
|
});
|
|
});
|
|
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
|
|
})();
|
|
|
|
</script>
|
|
</body></html> |