1005 lines
63 KiB
Plaintext
1005 lines
63 KiB
Plaintext
<!DOCTYPE html>
|
||
<html lang="fr">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>WEVAL Arena — Command Center</title>
|
||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||
<style>
|
||
*{margin:0;padding:0;box-sizing:border-box}
|
||
:root{--bg:#06060c;--bg2:#0c0c18;--bg3:#13132a;--bg4:#1a1a3a;--bg5:#222250;--fg:#e4e4f0;--fg2:#9898b8;--fg3:#5a5a78;--bl:#3b82f6;--vi:#8b5cf6;--cy:#06d6a0;--gn:#22c55e;--rd:#ef4444;--go:#f59e0b;--pk:#ec4899;--bd:#1e1e40;--r:10px}
|
||
body{font-family:'Outfit',sans-serif;background:var(--bg);color:var(--fg);height:100vh;display:grid;grid-template-columns:280px 1fr 300px;grid-template-rows:52px 1fr;overflow:hidden}
|
||
body.sidebar-closed{grid-template-columns:0 1fr 300px}
|
||
body.panel-closed{grid-template-columns:280px 1fr 0}
|
||
body.both-closed{grid-template-columns:0 1fr 0}
|
||
|
||
/* HEADER */
|
||
.hdr{grid-column:1/-1;display:flex;align-items:center;justify-content:space-between;padding:0 16px;background:var(--bg2);border-bottom:1px solid var(--bd);z-index:10}
|
||
.hdr-left{display:flex;align-items:center;gap:10px}
|
||
.hdr-logo{font-size:16px;font-weight:700;display:flex;align-items:center;gap:8px}
|
||
.hdr-logo .dot{width:10px;height:10px;border-radius:50%;background:var(--cy);box-shadow:0 0 8px var(--cy);animation:pulse 2s infinite}
|
||
.badge{font-size:9px;padding:2px 8px;background:var(--vi);border-radius:12px;font-weight:600;letter-spacing:.5px}
|
||
.hdr-center{display:flex;gap:4px}
|
||
.hdr-tab{padding:6px 14px;font-size:11px;font-weight:600;border-radius:6px;cursor:pointer;color:var(--fg3);transition:.2s;border:1px solid transparent}
|
||
.hdr-tab:hover{color:var(--fg);background:var(--bg3)}
|
||
.hdr-tab.on{color:var(--cy);background:var(--bg3);border-color:var(--cy)33}
|
||
.hdr-right{display:flex;gap:6px;align-items:center}
|
||
.hdr-btn{padding:5px 12px;font-size:11px;border-radius:6px;border:1px solid var(--bd);background:var(--bg3);color:var(--fg2);cursor:pointer;font-family:inherit;transition:.2s}
|
||
.hdr-btn:hover{background:var(--bg4);color:var(--fg)}
|
||
|
||
/* LEFT SIDEBAR */
|
||
.sidebar{background:var(--bg2);border-right:1px solid var(--bd);overflow-y:auto;display:flex;flex-direction:column;transition:.3s}
|
||
.sb-section{padding:12px;border-bottom:1px solid var(--bd)}
|
||
.sb-title{font-size:10px;font-weight:700;color:var(--fg3);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;display:flex;align-items:center;gap:6px}
|
||
.sb-search{width:100%;padding:7px 10px;background:var(--bg3);border:1px solid var(--bd);border-radius:6px;color:var(--fg);font-size:12px;font-family:inherit;outline:none}
|
||
.sb-search:focus{border-color:var(--bl)}
|
||
.sb-item{padding:6px 8px;font-size:12px;color:var(--fg2);border-radius:6px;cursor:pointer;transition:.15s;display:flex;align-items:center;gap:6px;margin:2px 0}
|
||
.sb-item:hover{background:var(--bg3);color:var(--fg)}
|
||
.sb-item .ico{font-size:14px;width:20px;text-align:center}
|
||
.sb-stat{display:flex;justify-content:space-between;padding:4px 0;font-size:11px}
|
||
.sb-stat-v{font-weight:600;font-family:'JetBrains Mono',monospace;font-size:11px}
|
||
.sb-stat-v.ok{color:var(--cy)}
|
||
.sb-stat-v.warn{color:var(--go)}
|
||
|
||
/* MAIN CHAT */
|
||
.main{display:flex;flex-direction:column;overflow:hidden;position:relative}
|
||
.chat{flex:1;overflow-y:auto;padding:20px;display:flex;flex-direction:column;gap:14px}
|
||
.chat::-webkit-scrollbar{width:5px}
|
||
.chat::-webkit-scrollbar-thumb{background:var(--bg4);border-radius:3px}
|
||
|
||
.welcome{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:12px}
|
||
.welcome h1{font-size:32px;font-weight:800;background:linear-gradient(135deg,var(--cy),var(--bl),var(--vi));-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:-.5px}
|
||
.welcome p{color:var(--fg3);font-size:13px;max-width:480px;text-align:center;line-height:1.6}
|
||
.welcome-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-top:12px;width:100%;max-width:600px}
|
||
.wg-card{padding:10px;background:var(--bg2);border:1px solid var(--bd);border-radius:8px;cursor:pointer;transition:.2s;text-align:center}
|
||
.wg-card:hover{border-color:var(--cy);background:var(--bg3);transform:translateY(-2px)}
|
||
.wg-card .wg-ico{font-size:20px;margin-bottom:4px}
|
||
.wg-card .wg-txt{font-size:10px;color:var(--fg2)}
|
||
|
||
.msg{display:flex;gap:10px;max-width:760px;width:100%;margin:0 auto;animation:fadeIn .25s}
|
||
.msg.user{flex-direction:row-reverse}
|
||
.msg-av{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;flex-shrink:0}
|
||
.msg.bot .msg-av{background:linear-gradient(135deg,var(--cy),var(--bl))}
|
||
.msg.user .msg-av{background:var(--bg4)}
|
||
.msg-body{background:var(--bg2);border:1px solid var(--bd);border-radius:var(--r);padding:12px 16px;font-size:13px;line-height:1.7;max-width:640px}
|
||
.msg.user .msg-body{background:var(--bl)12;border-color:var(--bl)30}
|
||
.msg-body pre{background:var(--bg);padding:10px;border-radius:6px;overflow-x:auto;margin:6px 0;font-family:'JetBrains Mono',monospace;font-size:11px;border:1px solid var(--bd)}
|
||
.msg-body code{font-family:'JetBrains Mono',monospace;font-size:11px;background:var(--bg);padding:1px 5px;border-radius:3px}
|
||
.msg-meta{font-size:9px;color:var(--fg3);margin-top:5px;display:flex;gap:8px;flex-wrap:wrap}
|
||
.msg-meta span{display:flex;align-items:center;gap:3px}
|
||
.msg-meta .prov{color:var(--cy);font-weight:600}
|
||
|
||
/* INPUT */
|
||
.input-area{padding:12px 20px 16px;border-top:1px solid var(--bd);background:var(--bg2)}
|
||
.modes{display:flex;gap:4px;margin-bottom:8px;flex-wrap:wrap}
|
||
.mode{padding:5px 12px;border-radius:16px;border:1px solid var(--bd);background:var(--bg3);color:var(--fg3);font-size:11px;cursor:pointer;transition:.2s;font-family:inherit;font-weight:500;display:flex;align-items:center;gap:4px}
|
||
.mode:hover{color:var(--fg);background:var(--bg4)}
|
||
.mode.on{border-color:var(--cy);color:var(--cy);background:var(--cy)0d}
|
||
.mode.deepthink.on{border-color:var(--vi);color:var(--vi);background:var(--vi)0d}
|
||
.mode.search.on{border-color:var(--bl);color:var(--bl);background:var(--bl)0d}
|
||
.mode.expert.on{border-color:var(--go);color:var(--go);background:var(--go)0d}
|
||
.mode.code.on{border-color:var(--gn);color:var(--gn);background:var(--gn)0d}
|
||
.mode.creative.on{border-color:var(--pk);color:var(--pk);background:var(--pk)0d}
|
||
.input-row{display:flex;gap:6px;align-items:end}
|
||
.input-box{flex:1;background:var(--bg3);border:1px solid var(--bd);border-radius:var(--r);padding:12px 14px;font-size:13px;color:var(--fg);font-family:inherit;resize:none;outline:none;min-height:46px;max-height:180px;transition:.2s}
|
||
.input-box:focus{border-color:var(--cy)}
|
||
.send{width:42px;height:42px;border-radius:50%;background:linear-gradient(135deg,var(--cy),var(--bl));border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.15s;flex-shrink:0}
|
||
.send:hover{transform:scale(1.05)}
|
||
.send:disabled{opacity:.3;cursor:not-allowed}
|
||
.send svg{width:16px;height:16px;fill:#fff}
|
||
.model-sel{padding:5px 10px;background:var(--bg3);border:1px solid var(--bd);border-radius:6px;color:var(--fg2);font-size:10px;font-family:'JetBrains Mono',monospace;cursor:pointer;outline:none}
|
||
|
||
/* RIGHT PANEL */
|
||
.panel{background:var(--bg2);border-left:1px solid var(--bd);overflow-y:auto;display:flex;flex-direction:column;transition:.3s}
|
||
.pn-section{padding:12px;border-bottom:1px solid var(--bd)}
|
||
.pn-title{font-size:10px;font-weight:700;color:var(--fg3);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px}
|
||
.pn-card{background:var(--bg3);border:1px solid var(--bd);border-radius:8px;padding:10px;margin:4px 0;font-size:11px}
|
||
.pn-card-h{display:flex;justify-content:space-between;margin-bottom:4px}
|
||
.pn-card-n{font-weight:600;font-size:12px}
|
||
.pn-card-s{font-family:'JetBrains Mono',monospace;font-weight:600}
|
||
.pn-card-s.ok{color:var(--cy)}
|
||
.pn-bar{height:3px;background:var(--bg);border-radius:2px;margin-top:6px;overflow:hidden}
|
||
.pn-bar-f{height:100%;border-radius:2px;transition:.3s}
|
||
.pn-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}
|
||
.pn-kpi{text-align:center;padding:8px;background:var(--bg3);border-radius:6px;border:1px solid var(--bd)}
|
||
.pn-kpi-v{font-size:16px;font-weight:700;font-family:'JetBrains Mono',monospace}
|
||
.pn-kpi-l{font-size:9px;color:var(--fg3);margin-top:2px}
|
||
.pn-action{display:block;width:100%;padding:7px;margin:3px 0;background:var(--bg3);border:1px solid var(--bd);border-radius:6px;color:var(--fg2);font-size:11px;cursor:pointer;font-family:inherit;text-align:left;transition:.15s}
|
||
.pn-action:hover{background:var(--bg4);color:var(--fg);border-color:var(--cy)55}
|
||
|
||
.loading span{width:6px;height:6px;background:var(--cy);border-radius:50%;display:inline-block;animation:bounce .5s infinite alternate;margin:0 2px}
|
||
.loading span:nth-child(2){animation-delay:.15s}
|
||
.loading span:nth-child(3){animation-delay:.3s}
|
||
@keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1}}
|
||
@keyframes bounce{to{transform:translateY(-6px);opacity:.3}}
|
||
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}
|
||
@media(max-width:900px){body{grid-template-columns:0 1fr 0 !important}.sidebar,.panel{display:none}}
|
||
|
||
@keyframes pulse-badge{0%,100%{opacity:1}50%{opacity:.4}}
|
||
#healthBadge{animation:pulse-badge 2s infinite}
|
||
#chat{scroll-behavior:smooth}
|
||
|
||
/* === OPUS RESPONSIVE FIX v2 19avr — append-only, doctrine #14 === */
|
||
@media(max-width: 480px) {
|
||
html, body { overflow-x: hidden !important; max-width: 100vw; }
|
||
body, main, section, article { word-break: break-word; overflow-wrap: anywhere; }
|
||
img, video, iframe, canvas, svg, table, pre, code { max-width: 100% !important; }
|
||
pre, code { white-space: pre-wrap; word-break: break-all; }
|
||
table { display: block; overflow-x: auto; }
|
||
.container, [class*="container"], [class*="wrapper"] { max-width: 100vw !important; padding-left: 12px !important; padding-right: 12px !important; }
|
||
[class*="grid"], [class*="-grid"] { grid-template-columns: 1fr !important; gap: 10px !important; }
|
||
[class*="kpi"], [class*="stats"], [class*="-cards"] { grid-template-columns: 1fr !important; }
|
||
header, nav, footer { flex-wrap: wrap !important; }
|
||
header > *, nav > *, footer > * { max-width: 100%; }
|
||
h1 { font-size: 22px !important; word-break: break-word; }
|
||
h2 { font-size: 18px !important; }
|
||
.pitch, [class*="pitch"], [class*="hero"] { word-break: break-word; overflow-wrap: anywhere; }
|
||
}
|
||
/* === OPUS RESPONSIVE FIX v2 END === */
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="hdr">
|
||
<div class="hdr-left">
|
||
<div class="hdr-logo"><span class="dot"></span> WEVAL Arena</div>
|
||
<span class="badge">COMMAND CENTER</span> <span id="healthBadge" style="color:var(--go);font-size:0.7em;margin-left:8px">⏳</span>
|
||
</div>
|
||
<div class="hdr-center">
|
||
<div class="hdr-tab on" onclick="location.href='/deepseek.html'">💬 Chat</div>
|
||
<div class="hdr-tab" onclick="location.href='/wevia.html'">🧠 Master</div>
|
||
<div class="hdr-tab" onclick="location.href='/l99-saas.html'">📊 L99</div>
|
||
<div class="hdr-tab" onclick="location.href='/tools-hub.html'">🔧 Tools</div>
|
||
<div class="hdr-tab" onclick="location.href='/weval-wiring.html'">⚡ Wiring</div>
|
||
</div>
|
||
<div class="hdr-right">
|
||
<select id="modelSelect" class="model-select" onchange="currentModel=this.value">
|
||
<option value="auto">⚙️ Auto (meilleur disponible)</option>
|
||
|
||
<optgroup label="🏠 SOUVERAIN — IA WEVAL 0€ ILLIMITÉ">
|
||
<option value="wevia-master">🧠 WEVIA Master · 310 intents · 88/90</option>
|
||
<option value="consensus">⚖️ Consensus MoA · 4 providers · 84/90</option>
|
||
<option value="manager">👔 Manager · orchestration · 83/90</option>
|
||
<option value="wevia-public">💬 WEVIA Public · chatbot · 82/90</option>
|
||
<option value="wevia-console">🖥️ WEVIA Console · 71 modules · 81/90</option>
|
||
<option value="wevia-widget">🔮 WEVIA Widget · embed · 80/90</option>
|
||
<option value="wevia-code">💻 WevCode · 4 modes · 82/90</option>
|
||
<option value="wevia-brain">🧬 Brain RAG · Qdrant 16K · 80/90</option>
|
||
<option value="wevia-search">🔍 Search SearXNG · souverain</option>
|
||
<option value="wevia-director">🎬 Director · supervision · 76/90</option>
|
||
<option value="wevia-research">📚 Deep Research · multi-source</option>
|
||
<option value="wevia-creative">🎨 Creative Engine</option>
|
||
<option value="wevia-dream">💭 Dream · génération</option>
|
||
<option value="wevia-vision">👁️ Vision · multimodal</option>
|
||
<option value="wevia-smart">🧭 Smart Router · auto</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🏠 SOUVERAIN — Agents 0€ ILLIMITÉ">
|
||
<option value="paperclip">📎 Paperclip · projet · 76/90</option>
|
||
<option value="deerflow">🦌 DeerFlow · 42 skills · 79/90</option>
|
||
<option value="mirofish">🐟 WePredict/MiroFish · 75/90</option>
|
||
<option value="blade-ai">⚔️ Blade IA · desktop · 76/90</option>
|
||
<option value="hermes">📨 Hermes · messaging · 75/90</option>
|
||
<option value="kilo">📊 Kilo · KPI tracking · 73/90</option>
|
||
<option value="ux-agent">🎨 UX Agent · visual QA · 71/90</option>
|
||
<option value="wevia-quality">✅ Quality Agent</option>
|
||
<option value="wevia-chef">👨🍳 Agent Chef</option>
|
||
<option value="n8n">⚡ n8n Workflows</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🏠 SOUVERAIN — Backend 0€ ILLIMITÉ">
|
||
<option value="wevdroid">🤖 WevDroid · diagnostic · 79/90</option>
|
||
<option value="wevcode">💻 WevCode IDE · code · 82/90</option>
|
||
<option value="claw-code">🐙 Claw Code · review · 78/90</option>
|
||
<option value="openclaw">🐙 OpenClaw · chat local · 74/90</option>
|
||
<option value="cortex">🌐 Cortex · archi SVG · 77/90</option>
|
||
<option value="wevads-ia">📧 WEVADS IA · email · 78/90</option>
|
||
<option value="ethica-chat">💊 Ethica Chat · pharma · 77/90</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🏠 SOUVERAIN — Sécurité 0€ ILLIMITÉ">
|
||
<option value="sentinel">🔒 Sentinel · S95 · 75/90</option>
|
||
<option value="guardian">🛡️ Guardian · SSO · 74/90</option>
|
||
<option value="nuclei">🔬 Nuclei · pentest · 73/90</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🏠 SOUVERAIN — Testing 0€ ILLIMITÉ">
|
||
<option value="l99-brain">🧪 L99 Brain · 29/29 · 80/90</option>
|
||
<option value="ops-center">🎯 Ops Center</option>
|
||
<option value="oss-discovery">🔭 OSS Discovery</option>
|
||
<option value="ai-bench">📊 AI Benchmark · 39 IAs</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🏠 SOUVERAIN — LLM Local 0€ ILLIMITÉ">
|
||
<option value="ollama">🏠 Qwen3 4B · Ollama · 72/90</option>
|
||
<option value="ollama-gemma4">🏠 Gemma4 E4B</option>
|
||
<option value="weval-brain-v3">🧠 WEVAL Brain v3 (email/pharma fine-tuné) · local · 72/90</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="☁️ 0€ ILLIMITÉ — Aucun cap strict">
|
||
<option value="cf-deepseek-r1">🧠 DeepSeek-R1 32B [CF]</option>
|
||
<option value="cf-llama">🦙 Llama 3.1 8B [CF]</option>
|
||
<option value="nim-llama">🟢 Llama 3.1 8B [NVIDIA.NIM.40rpm]</option>
|
||
<option value="nim-deepseek">🧠 DeepSeek-R1 8B [NIM]</option>
|
||
<option value="mistral">🇫🇷 Mistral Nemo EU</option>
|
||
<option value="alibaba-qwen">🟣 Qwen Turbo [Alibaba]</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="⚡ 0€ RATE LIMITÉ — Cap quotidien">
|
||
<option value="or-gpt-oss">💎 GPT-OSS 120B [50/j]</option>
|
||
<option value="or-nemotron">🔥 Nemotron-3 120B [50/j]</option>
|
||
<option value="or-gemma4">✨ Gemma-4 26B [50/j]</option>
|
||
<option value="cohere">📘 Cohere R+ [1000/mois]</option>
|
||
<option value="groq-llama">⚡ Groq 70B [à renouveler]</option>
|
||
<option value="cerebras">🚀 Cerebras [à renouveler]</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="💰 PAYANT — Premium">
|
||
<option value="anthropic">🟠 Claude Opus 4.6 · 90/90</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🌐 WEBCHAT 0€ ILLIMITÉ — Playwright">
|
||
<option value="deepseek-web">🔥 DeepSeek Chat</option>
|
||
<option value="deepseek-web-think">🧠 DS DeepThink</option>
|
||
<option value="deepseek-web-search">🔍 DS Search</option>
|
||
<option value="web-copilot">🔵 Copilot GPT-4o</option>
|
||
<option value="web-huggingchat">🤗 HuggingChat 121</option>
|
||
<option value="web-meta">Ⓜ️ Meta AI Llama</option>
|
||
<option value="web-duckduckgo">🦆 DuckDuckGo AI</option>
|
||
<option value="web-qwen">🟣 Qwen Chat</option>
|
||
<option value="web-lechat">🇫🇷 Le Chat Mistral</option>
|
||
<option value="web-perplexity">🔍 Perplexity</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🛠️ SKILLS — Exécution réelle 0€">
|
||
<option value="skill-pdf">📄 Générer PDF</option>
|
||
<option value="skill-excel">📊 Générer Excel</option>
|
||
<option value="skill-pptx">📽️ Générer PowerPoint</option>
|
||
<option value="skill-image">🖼️ Générer Image SVG</option>
|
||
<option value="skill-tts">🔊 Text-to-Speech MP3</option>
|
||
<option value="skill-video">🎬 Générer Vidéo MP4</option>
|
||
<option value="skill-code">💻 Code Agent (ERP/SaaS)</option>
|
||
<option value="skill-debug">🐛 Debug 4 phases</option>
|
||
<option value="skill-cicd">🚀 CI/CD Pipeline</option>
|
||
<option value="skill-docker">🐳 Docker Manager</option>
|
||
<option value="skill-webhook">🔗 Créer Webhook</option>
|
||
<option value="skill-browser">🌐 Screenshot Page</option>
|
||
<option value="skill-pr">📝 PR Review</option>
|
||
<option value="skill-lint">🔧 Lint & Auto-fix</option>
|
||
<option value="skill-sql">🗄️ SQL/Data Query</option>
|
||
<option value="skill-scrape">🕷️ Web Scrape</option>
|
||
<option value="skill-cron">⏰ Cron Manager</option>
|
||
<option value="skill-multiagent">🤖 Multi-Agent 5ch</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="📋 INDEX — Tous les écrans (209 pages)">
|
||
<option value="idx-arena">🏟️ WEVAL Arena (cette page)</option>
|
||
<option value="idx-master">🧠 WEVIA Master</option>
|
||
<option value="idx-console">🖥️ WEVIA Console (71 modules)</option>
|
||
<option value="idx-ops">🎯 Ops Center</option>
|
||
<option value="idx-l99">🧪 L99 SaaS</option>
|
||
<option value="idx-hubs">📚 Tous les Hubs (26)</option>
|
||
<option value="idx-agents">🤖 Agents Fleet (14)</option>
|
||
<option value="idx-monitors">📊 Monitors (10)</option>
|
||
<option value="idx-ethica">💊 Ethica (7)</option>
|
||
<option value="idx-blade">⚔️ Blade Center</option>
|
||
<option value="idx-director">🎬 Director</option>
|
||
<option value="idx-wevads">📧 WEVADS Arsenal (S95 150+)</option>
|
||
<option value="idx-admin">🔐 Admin</option>
|
||
<option value="idx-infra">🏗️ Infrastructure</option>
|
||
<option value="idx-security">🛡️ Security Hub</option>
|
||
<option value="idx-benchmark">📊 AI Benchmark (39 IAs)</option>
|
||
<option value="idx-wiring">🔌 Wiring Map</option>
|
||
<option value="idx-wiki">📖 Wiki</option>
|
||
<option value="idx-register">📋 Register</option>
|
||
<option value="idx-life">💌 WEVIA Life</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🤖 MULTI-AGENT — Exécution réelle parallèle">
|
||
<option value="multiagent-3">🤖 3 Agents (Master+NIM+Alibaba)</option>
|
||
<option value="multiagent-5">🤖 5 Agents (Master+NIM+Alibaba+Mistral+OR)</option>
|
||
<option value="multiagent-all">🤖 ALL Agents (tous providers actifs)</option>
|
||
<option value="multiagent-sovereign">🏠 Souverain Only (Master+Public+Search)</option>
|
||
<option value="multiagent-coders">💻 Coders (NIM-DS+Alibaba+Mistral+GPT-OSS)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="⚔️ ARSENAL S95 — 170 écrans WEVADS">
|
||
<option value="arsenal-accounts">🔑 Account Creator</option>
|
||
<option value="arsenal-factory">🏭 Cloud Account Factory</option>
|
||
<option value="arsenal-ia-factory">🤖 IA Provider Factory</option>
|
||
<option value="arsenal-dark-scout">🕵️ Dark Scout</option>
|
||
<option value="arsenal-personas">👤 Mail Personas</option>
|
||
<option value="arsenal-cvc">💳 CVC Vault</option>
|
||
<option value="arsenal-brain">🧠 Brain Central</option>
|
||
<option value="arsenal-captcha">🔓 Captcha Solver</option>
|
||
<option value="arsenal-cf">☁️ CF Accounts Manager</option>
|
||
<option value="arsenal-rotation">🔄 Provider Rotation</option>
|
||
<option value="arsenal-all">📋 Arsenal Complet (170)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="📚 HUBS — 28 centres de contrôle">
|
||
<option value="hub-ai">🤖 AI Hub</option>
|
||
<option value="hub-agents">🤖 Agents Hub</option>
|
||
<option value="hub-anthropic">🟠 Anthropic Hub</option>
|
||
<option value="hub-apikey">🔑 API Key Hub</option>
|
||
<option value="hub-blade">⚔️ Blade Hub</option>
|
||
<option value="hub-cf">☁️ Cloudflare Hub</option>
|
||
<option value="hub-deepseek">🧠 DeepSeek Hub</option>
|
||
<option value="hub-deerflow">🦌 DeerFlow Hub</option>
|
||
<option value="hub-docker">🐳 Docker Hub</option>
|
||
<option value="hub-email">📧 Email Hub</option>
|
||
<option value="hub-ethica">💊 Ethica Hub</option>
|
||
<option value="hub-github">🐙 GitHub Hub</option>
|
||
<option value="hub-google">🔍 Google Hub</option>
|
||
<option value="hub-gpu">🎮 GPU Hub</option>
|
||
<option value="hub-hetzner">🏗️ Hetzner Hub</option>
|
||
<option value="hub-hf">🤗 HuggingFace Hub</option>
|
||
<option value="hub-keys">🔐 Keys Hub</option>
|
||
<option value="hub-monitor">📊 Monitoring Hub</option>
|
||
<option value="hub-n8n">⚡ n8n Hub</option>
|
||
<option value="hub-office">📄 Office Hub</option>
|
||
<option value="hub-paperclip">📎 Paperclip Hub</option>
|
||
<option value="hub-qa">✅ QA Hub</option>
|
||
<option value="hub-qdrant">🧬 Qdrant Hub</option>
|
||
<option value="hub-security">🛡️ Security Hub</option>
|
||
<option value="hub-toolhub">🔧 ToolHub</option>
|
||
<option value="hub-wevads">📧 WEVADS Hub</option>
|
||
<option value="hub-wevia">🧠 WEVIA Hub</option>
|
||
</optgroup>
|
||
<optgroup label="📱 APPS — Outils et interfaces">
|
||
<option value="app-admin">🔐 Admin</option>
|
||
<option value="app-architecture">🏗️ Architecture</option>
|
||
<option value="app-benchmark">📊 AI Benchmark</option>
|
||
<option value="app-blade-center">⚔️ Blade Center</option>
|
||
<option value="app-booking">📅 Booking</option>
|
||
<option value="app-claude-monitor">🟠 Claude Monitor</option>
|
||
<option value="app-command">🎯 Command Center</option>
|
||
<option value="app-cron">⏰ Cron Control</option>
|
||
<option value="app-crm">👥 CRM</option>
|
||
<option value="app-cyber">🛡️ Cyber Monitor</option>
|
||
<option value="app-director">🎬 Director Center</option>
|
||
<option value="app-droid">🤖 Droid Terminal</option>
|
||
<option value="app-enterprise">🏢 Enterprise</option>
|
||
<option value="app-ethica-hcp">💊 Ethica HCP</option>
|
||
<option value="app-ethica-pipeline">💊 Ethica Pipeline</option>
|
||
<option value="app-infra">🏗️ Infra Monitor</option>
|
||
<option value="app-l99">🧪 L99 SaaS</option>
|
||
<option value="app-medreach">📧 MedReach</option>
|
||
<option value="app-monitoring">📊 Monitoring</option>
|
||
<option value="app-nonreg">✅ NonReg</option>
|
||
<option value="app-oss">🔭 OSS Discovery</option>
|
||
<option value="app-realtime">📡 Realtime Monitor</option>
|
||
<option value="app-security">🛡️ Security Dashboard</option>
|
||
<option value="app-solution">🔍 Solution Finder</option>
|
||
<option value="app-sovereign">🏠 Sovereign Claude</option>
|
||
<option value="app-wiki">📖 Wiki</option>
|
||
<option value="app-wiring">🔌 Wiring Map</option>
|
||
<option value="app-registry">🧠 IA Souveraine (9 couches)</option>
|
||
<option value="app-faq">⚠️ FAQ Anti-Régression (47 pièges)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="💰 BUDGET — Suivi consommation IA">
|
||
<option value="budget-status">💰 Budget Status (ce mois)</option>
|
||
<option value="budget-daily">📊 Conso Journalière</option>
|
||
<option value="budget-savings">💚 Économies vs Payant</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🧠 CLAUDE CODE — Skills & Plugins">
|
||
<option value="cc-superclaude">⚡ SuperClaude (30 cmds, personas)</option>
|
||
<option value="cc-oh-my">🤖 oh-my-claudecode (19 agents)</option>
|
||
<option value="cc-antigravity">🚀 Antigravity (4198 skills)</option>
|
||
<option value="cc-everything">🛡️ Everything CC (420 skills)</option>
|
||
<option value="cc-awesome">📦 Awesome Toolkit (135 agents)</option>
|
||
<option value="cc-hf-skills">🤗 HuggingFace Skills (12)</option>
|
||
<option value="cc-voltagent">⚡ VoltAgent (1000+ skills)</option>
|
||
<option value="cc-mem">🧠 Claude-Mem (mémoire persistante)</option>
|
||
</optgroup>
|
||
<optgroup label="🔬 AI/ML — Training & Inference">
|
||
<option value="ml-hf">🤗 HuggingFace Hub (1M+ modèles)</option>
|
||
<option value="ml-vllm">⚡ vLLM (PagedAttention)</option>
|
||
<option value="ml-localai">🏠 LocalAI (OpenAI compat)</option>
|
||
<option value="ml-openwebui">🌐 Open WebUI</option>
|
||
<option value="ml-librechat">💬 LibreChat (multi-provider)</option>
|
||
<option value="ml-unsloth">🦥 Unsloth (2× faster finetune)</option>
|
||
<option value="ml-llamafactory">🏭 LLaMA-Factory (zero-code)</option>
|
||
<option value="ml-ragflow">📚 RAGFlow (GraphRAG)</option>
|
||
<option value="ml-langfuse">📊 Langfuse (LLM observability)</option>
|
||
<option value="ml-whisper">🎤 Whisper.cpp (STT gratuit)</option>
|
||
<option value="ml-haystack">🔍 Haystack (RAG prod)</option>
|
||
<option value="ml-crewai">🤖 CrewAI (multi-agent)</option>
|
||
<option value="ml-modelscope">🟣 ModelScope (Alibaba Hub)</option>
|
||
<option value="ml-lmarena">🏆 LMArena (Benchmark)</option>
|
||
<option value="ml-manus">🤖 Manus (agent autonome)</option>
|
||
<option value="ml-dify">🔄 Dify (LLM platform)</option>
|
||
<option value="ml-browseruse">🌐 Browser Use (agent web)</option>
|
||
</optgroup>
|
||
<optgroup label="🆓 GPU FREE — Compute gratuit">
|
||
<option value="gpu-colab">🎮 Google Colab (T4/A100)</option>
|
||
<option value="gpu-kaggle">🎮 Kaggle (P100/T4 30h/sem)</option>
|
||
<option value="gpu-lightning">⚡ Lightning AI (22h/mois)</option>
|
||
<option value="gpu-oracle">☁️ Oracle Free (4 ARM 24GB)</option>
|
||
<option value="gpu-hf-spaces">🤗 HF Spaces (gratuit)</option>
|
||
<option value="gpu-runpod">🎮 RunPod (spots)</option>
|
||
<option value="gpu-vastai">🎮 Vast.ai (A100 $0.50/h)</option>
|
||
<option value="gpu-tensorDock">🎮 TensorDock (RTX4090 $0.34)</option>
|
||
</optgroup>
|
||
<optgroup label="🎨 DESIGN & MEDIA — Gratuit">
|
||
<option value="media-dreamina">🎨 Dreamina (ByteDance)</option>
|
||
<option value="media-msdesigner">🎨 MS Designer</option>
|
||
<option value="media-stitch">🎨 Google Stitch (UI)</option>
|
||
<option value="media-lyria3">🎵 Lyria 3 (musique IA)</option>
|
||
<option value="media-suno">🎵 Suno (musique IA)</option>
|
||
<option value="media-ltxvideo">🎬 LTX-Video (vidéo IA)</option>
|
||
<option value="media-excalidraw">✏️ Excalidraw (whiteboard)</option>
|
||
</optgroup>
|
||
<optgroup label="🐳 OSS DISCOVERY — 36 outils">
|
||
<option value="oss-argocd">🚀 ArgoCD (GitOps K8s)</option>
|
||
<option value="oss-harbor">🐳 Harbor (container registry)</option>
|
||
<option value="oss-loki">📊 Grafana Loki (logs)</option>
|
||
<option value="oss-signoz">📊 SigNoz (APM)</option>
|
||
<option value="oss-infisical">🔐 Infisical (secrets)</option>
|
||
<option value="oss-opentofu">🏗️ OpenTofu (IaC)</option>
|
||
<option value="oss-woodpecker">🐦 Woodpecker CI</option>
|
||
<option value="oss-plane">📋 Plane (Jira alt)</option>
|
||
<option value="oss-calcom">📅 Cal.com (booking)</option>
|
||
<option value="oss-chatwoot">💬 Chatwoot (support)</option>
|
||
<option value="oss-clickhouse">📊 ClickHouse (OLAP)</option>
|
||
<option value="oss-airbyte">🔄 Airbyte (data integ)</option>
|
||
<option value="oss-nocodb">📊 NocoDB (Airtable alt)</option>
|
||
<option value="oss-posthog">📊 PostHog (analytics)</option>
|
||
<option value="oss-jitsi">📹 Jitsi Meet (video)</option>
|
||
<option value="oss-trivy">🛡️ Trivy (scanner)</option>
|
||
<option value="oss-gitleaks">🔐 Gitleaks (secrets scan)</option>
|
||
<option value="oss-appsmith">🔧 Appsmith (low-code)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🔧 OSS TOOLS — 40+ outils clonés">
|
||
<option value="oss-autogen">🤖 AutoGen (Microsoft)</option>
|
||
<option value="oss-crewai">🚀 CrewAI (Multi-agent)</option>
|
||
<option value="oss-deepagent">🧠 DeepAgent</option>
|
||
<option value="oss-goose">🦆 Goose (Block AI)</option>
|
||
<option value="oss-antigravity">🌀 AntiGravity Skills</option>
|
||
<option value="oss-langchain">🔗 LangChain</option>
|
||
<option value="oss-langflow">🌊 LangFlow</option>
|
||
<option value="oss-dify">💎 Dify</option>
|
||
<option value="oss-jan">🤖 Jan (Local AI)</option>
|
||
<option value="oss-openwebui">🌐 Open WebUI</option>
|
||
<option value="oss-anythingllm">📚 AnythingLLM</option>
|
||
<option value="oss-librechat">💬 LibreChat</option>
|
||
<option value="oss-localai">🏠 LocalAI</option>
|
||
<option value="oss-vllm">⚡ vLLM</option>
|
||
<option value="oss-whisper">🎤 Whisper.cpp</option>
|
||
<option value="oss-ltxvideo">🎬 LTX-Video</option>
|
||
<option value="oss-supermemory">🧠 SuperMemory</option>
|
||
<option value="oss-activepieces">⚙️ ActivePieces</option>
|
||
<option value="oss-listmonk">📧 Listmonk</option>
|
||
<option value="oss-wazuh">🛡️ Wazuh SIEM</option>
|
||
<option value="oss-holyclaude">✝️ HolyClaude</option>
|
||
<option value="oss-superclaude">🦸 SuperClaude</option>
|
||
</optgroup>
|
||
<optgroup label="🆕 À CLONER — Blade Tasks">
|
||
<option value="clone-obsidian">📝 Obsidian (à cloner)</option>
|
||
<option value="clone-pinocchio">🤥 Pinocchio/Pinokio (à cloner)</option>
|
||
<option value="clone-manus">🖐️ Manus Agent (à cloner)</option>
|
||
<option value="clone-coderabbit">🐰 CodeRabbit (à cloner)</option>
|
||
<option value="clone-granite">🪨 IBM Granite (à cloner)</option>
|
||
<option value="clone-boltnew">⚡ Bolt.new (à cloner)</option>
|
||
<option value="clone-opendevin">🧑💻 OpenDevin/OpenHands (à cloner)</option>
|
||
<option value="clone-sweagent">🔧 SWE-Agent (à cloner)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🧬 MODÈLES LOCAUX — Ollama S204">
|
||
<option value="oss-glm4">🇨🇳 GLM-4 9B (multilingual)</option>
|
||
<option value="oss-medllama">💊 MedLlama2 + Meditron (medical)</option>
|
||
<option value="oss-minilm">📐 all-MiniLM (embeddings)</option>
|
||
<option value="oss-diffusiondb">🖼️ DiffusionDB (2M prompts)</option>
|
||
</optgroup>
|
||
<optgroup label="🔌 CLAUDE TOOLS — Skills & Plugins">
|
||
<option value="oss-everything-claude">🛡️ Everything Claude (420 skills)</option>
|
||
<option value="oss-awesome-claude">🔧 Awesome Claude Toolkit (135 agents)</option>
|
||
<option value="oss-skillsmith">🏭 SkillSmith (skill generator)</option>
|
||
</optgroup>
|
||
<optgroup label="🌐 PLATEFORMES IA — Installées">
|
||
<option value="oss-open-webui">🌐 Open WebUI (Ollama frontend)</option>
|
||
<option value="oss-euria">🇨🇭 Euria (Infomaniak souverain)</option>
|
||
<option value="oss-mastra">🔗 Mastra (agents framework TS)</option>
|
||
<option value="oss-browser-use">🌐 Browser Use (web agent)</option>
|
||
<option value="oss-scrapy">🕷️ Scrapy (4 spiders actifs)</option>
|
||
</optgroup>
|
||
<optgroup label="🛡️ SÉCURITÉ & MONITORING">
|
||
<option value="oss-aegis">🛡️ AEGIS Security (TrustA 0 vulns)</option>
|
||
<option value="oss-crowdsec">🛡️ CrowdSec (protection collaborative)</option>
|
||
<option value="oss-vaultwarden">🔐 Vaultwarden (passwords)</option>
|
||
<option value="oss-prometheus">📊 Prometheus (métriques)</option>
|
||
<option value="oss-evomaster">🧪 EvoMaster (REST/GraphQL test)</option>
|
||
<option value="oss-aios">🖥️ AIOS (OS pour agents)</option>
|
||
<option value="oss-trustmrr">📈 TrustMRR (ML evaluation)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="☁️ CLOUD FREE & GPU — Déploiement">
|
||
<option value="cloud-vercel">▲ Vercel (hosting+AI SDK)</option>
|
||
<option value="cloud-render">🟢 Render (free tier)</option>
|
||
<option value="cloud-railway">🚂 Railway (500h/mois free)</option>
|
||
<option value="cloud-flyio">✈️ Fly.io (3 VMs free)</option>
|
||
<option value="cloud-lambda">λ Lambda Cloud (GPU ML)</option>
|
||
<option value="cloud-hyperstack">⚡ Hyperstack (A6000 GPU)</option>
|
||
<option value="cloud-northflank">🌐 Northflank (multi-cloud)</option>
|
||
</optgroup>
|
||
<optgroup label="🎨 DESIGN & CREATIVE IA">
|
||
<option value="design-llooka">🎭 Llooka (avatars/logos IA)</option>
|
||
<option value="design-prompthero">🎯 PromptHero (marketplace)</option>
|
||
<option value="design-affinity">🎨 Affinity (alt Adobe)</option>
|
||
<option value="design-layer">🖼️ Layer.ai (images jeux)</option>
|
||
</optgroup>
|
||
<optgroup label="🔬 LLM INFERENCE & TOOLS">
|
||
<option value="llm-llamacpp">🦙 llama.cpp (GGUF CPU/GPU)</option>
|
||
<option value="llm-tgi">🤗 TGI HuggingFace (serving)</option>
|
||
<option value="llm-llamaindex">📚 LlamaIndex (RAG data)</option>
|
||
<option value="llm-flowise">🌊 Flowise (visual builder)</option>
|
||
<option value="llm-godmod3">🔀 godmod3.AI (multi-LLM routing)</option>
|
||
<option value="llm-notebooklm">📓 NotebookLM (Google AI)</option>
|
||
</optgroup>
|
||
<optgroup label="🔧 OUTILS DEV & KNOWLEDGE">
|
||
<option value="tool-ghgrab">📥 GHGrab (GitHub bulk DL)</option>
|
||
<option value="tool-blinkcode">📖 Blink Code Wiki</option>
|
||
<option value="tool-feeddough">📰 FeedDough (news IA)</option>
|
||
<option value="tool-prompthackers">🔐 PromptHackers (sécurité)</option>
|
||
<option value="tool-powertoys">⚡ PowerToys (QR/DNS/SSL/Hash)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="📡 TECH RADAR — We Use / Recommend">
|
||
<option value="radar-mautic">📧 Mautic (marketing automation 9.3K⭐)</option>
|
||
<option value="radar-postal">📨 Postal (mail delivery 15K⭐)</option>
|
||
<option value="radar-erpnext">🏭 ERPNext (full ERP 32K⭐)</option>
|
||
<option value="radar-supabase">🔥 Supabase (open Firebase 98K⭐)</option>
|
||
<option value="radar-metabase">📊 Metabase (BI dashboards 40K⭐)</option>
|
||
<option value="radar-coolify">🚀 Coolify (self-hosted PaaS 40K⭐)</option>
|
||
<option value="radar-frp">🔗 frp (reverse proxy 105K⭐)</option>
|
||
<option value="radar-comfyui">🎨 ComfyUI (Stable Diffusion 105K⭐)</option>
|
||
<option value="radar-traefik">🔀 Traefik (cloud proxy 53K⭐)</option>
|
||
<option value="radar-kubernetes">☸️ Kubernetes (121K⭐)</option>
|
||
<option value="radar-immich">📸 Immich (photos 94K⭐)</option>
|
||
<option value="radar-firecrawl">🔥 Firecrawl (web→LLM 93K⭐)</option>
|
||
</optgroup>
|
||
<optgroup label="🔬 OSS DISCOVERY — Exploring">
|
||
<option value="radar-langfuse">🔍 Langfuse (LLM observability 23K⭐)</option>
|
||
<option value="radar-ragflow">📄 RAGFlow (document RAG 65K⭐)</option>
|
||
<option value="radar-unsloth">⚡ Unsloth (2x faster fine-tune 54K⭐)</option>
|
||
<option value="radar-llamafactory">🏭 LLaMA-Factory (zero-code 60K⭐)</option>
|
||
<option value="radar-mlflow">📊 MLflow (MLOps 19K⭐)</option>
|
||
<option value="radar-haystack">🔎 Haystack (prod RAG 23K⭐)</option>
|
||
<option value="radar-argocd">🔄 ArgoCD (GitOps K8s 22K⭐)</option>
|
||
<option value="radar-harbor">🏗️ Harbor (container registry 28K⭐)</option>
|
||
<option value="radar-signoz">📈 SigNoz (APM traces 25K⭐)</option>
|
||
<option value="radar-infisical">🔐 Infisical (secrets mgmt 25K⭐)</option>
|
||
<option value="radar-opentofu">🌍 OpenTofu (Terraform fork 28K⭐)</option>
|
||
<option value="radar-woodpecker">🪶 Woodpecker CI (Gitea native 5K⭐)</option>
|
||
<option value="radar-velero">💾 Velero (K8s backup 9.2K⭐)</option>
|
||
<option value="radar-calcom">📅 Cal.com (scheduling 39K⭐)</option>
|
||
<option value="radar-chatwoot">💬 Chatwoot (omnichannel 28K⭐)</option>
|
||
<option value="radar-documenso">✍️ Documenso (e-sign 9K⭐)</option>
|
||
<option value="radar-clickhouse">🗃️ ClickHouse (OLAP 39K⭐)</option>
|
||
<option value="radar-airbyte">🔌 Airbyte (data connectors 21K⭐)</option>
|
||
<option value="radar-redpanda">🐼 Redpanda (Kafka alt 10K⭐)</option>
|
||
<option value="radar-jitsi">📹 Jitsi Meet (video conf 29K⭐)</option>
|
||
<option value="radar-livekit">🎙️ LiveKit (WebRTC+AI 22K⭐)</option>
|
||
<option value="radar-trivy">🔒 Trivy (vuln scanner 25K⭐)</option>
|
||
<option value="radar-gitleaks">🔑 Gitleaks (secrets detect 25K⭐)</option>
|
||
<option value="radar-falco">🦅 Falco (runtime security 7.6K⭐)</option>
|
||
<option value="radar-nocodb">📋 NocoDB (Airtable alt 50K⭐)</option>
|
||
<option value="radar-appsmith">🧱 Appsmith (low-code 35K⭐)</option>
|
||
<option value="radar-superset">📊 Superset (BI enterprise 65K⭐)</option>
|
||
<option value="radar-excalidraw">✏️ Excalidraw (whiteboard 119K⭐)</option>
|
||
<option value="radar-posthogg">📈 PostHog (product analytics 31K⭐)</option>
|
||
</optgroup>
|
||
|
||
<optgroup label="🧠 WEVAL BRAIN — Couches cognitives">
|
||
<option value="brain-nucleus">🧬 Brain Nucleus v3 (1334L, 23fn)</option>
|
||
<option value="cognitive-brain">🎯 Cognitive Brain (routing+guard)</option>
|
||
<option value="cognitive-opus">⚡ Cognitive Opus46 (CoT+dialectical)</option>
|
||
<option value="weval-mind">🔄 WEVAL Mind (cycle autonome)</option>
|
||
<option value="hamid-ia">🤖 HAMID IA (legacy brain)</option>
|
||
</optgroup>
|
||
<optgroup label="📧 WEVAL SEND — Email Platform">
|
||
<option value="weval-send">📨 WEVAL Send (DeliverAds)</option>
|
||
<option value="deliverads">📧 DeliverAds (delivery engine)</option>
|
||
<option value="mailwarm">🔥 MailWarm (IP warmup)</option>
|
||
<option value="mailforge">🔨 MailForge (template builder)</option>
|
||
<option value="mailstream">🌊 MailStream (flow control)</option>
|
||
<option value="deliverscore">📊 DeliverScore (reputation)</option>
|
||
<option value="emailverify">✅ EmailVerify (validation)</option>
|
||
<option value="inboxtest">📬 InboxTest (placement)</option>
|
||
<option value="reputationai">🛡️ ReputationAI (IP/domain)</option>
|
||
<option value="smsforge">📱 SMSForge (SMS campaigns)</option>
|
||
<option value="adscontrol">🎯 AdsControl (ad management)</option>
|
||
</optgroup>
|
||
<optgroup label="💊 ETHICA & MEDREACH — Pharma B2B">
|
||
<option value="ethica-chatbot">💊 Ethica Chatbot (131K HCPs)</option>
|
||
<option value="medreach-platform">🏥 MedReach Platform</option>
|
||
<option value="healthcare-crm">🏥 Healthcare CRM</option>
|
||
</optgroup>
|
||
<optgroup label="🤖 WEVAL AI SAAS — Produits IA">
|
||
<option value="outreachai">📧 OutreachAI (prospection)</option>
|
||
<option value="ai-sdr">🤖 AI SDR Agent (sales dev)</option>
|
||
<option value="proposalai">📋 ProposalAI (propositions)</option>
|
||
<option value="blueprintai">🏗️ BlueprintAI (architecture)</option>
|
||
<option value="canvasai">🎨 CanvasAI (design)</option>
|
||
<option value="copyai">✍️ CopyAI (rédaction)</option>
|
||
<option value="presentationai">📽️ PresentationAI (slides)</option>
|
||
<option value="translateai">🌍 TranslateAI (traduction)</option>
|
||
<option value="devforge">💻 DevForge AI (code gen)</option>
|
||
<option value="content-factory">📝 Content Factory</option>
|
||
<option value="creative-factory">🎨 Creative Factory</option>
|
||
</optgroup>
|
||
<optgroup label="📊 WEVAL BUSINESS — Consulting">
|
||
<option value="consulting-pro">👔 Consulting Pro</option>
|
||
<option value="leadforge">🎯 LeadForge (lead gen)</option>
|
||
<option value="datainsight">📊 DataInsight (analytics)</option>
|
||
<option value="wevanalytics">📈 Wevanalytics</option>
|
||
<option value="scout-intelligence">🕵️ Scout Intelligence</option>
|
||
<option value="cloudbridge">☁️ CloudBridge</option>
|
||
<option value="cloudcost">💰 CloudCost (FinOps)</option>
|
||
<option value="academy">🎓 Academy (formation)</option>
|
||
<option value="partner-program">🤝 Partner Program</option>
|
||
<option value="wevia-life">💌 WEVIA Life (email IA CoS)</option>
|
||
</optgroup>
|
||
<optgroup label="🏪 WEVAL COMMERCE — E-commerce IA">
|
||
<option value="storeforge">🏪 StoreForge (e-shop gen)</option>
|
||
<option value="storeai">🤖 StoreAI (shop assistant)</option>
|
||
<option value="formbuilder">📝 FormBuilder</option>
|
||
<option value="youtube-factory">🎬 YouTube Factory</option>
|
||
<option value="lyria-music">🎵 Lyria 3 (musique IA)</option>
|
||
</optgroup>
|
||
</select>
|
||
<button class="hdr-btn" id="dsConnect" onclick="connectDS()" style="background:var(--go)22;border-color:var(--go);color:var(--go)">🔗 Connecter DeepSeek</button>
|
||
<button class="hdr-btn" onclick="clearChat()">+ Nouveau</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- LEFT SIDEBAR -->
|
||
<div class="sidebar" id="sidebar">
|
||
<div class="sb-section">
|
||
<div class="sb-title">🔍 Recherche KB</div>
|
||
<input class="sb-search" id="kbSearch" placeholder="Chercher dans la KB..." onkeydown="if(event.key==='Enter')searchKB()">
|
||
<div id="kbResults" style="margin-top:6px"></div>
|
||
</div>
|
||
<div class="sb-section">
|
||
<div class="sb-title">📚 Wiki</div>
|
||
<div id="wikiList">
|
||
<div class="sb-item" onclick="askQ('wave status')"><span class="ico">📋</span> Wave 114</div>
|
||
<div class="sb-item" onclick="askQ('reconcilie tout')"><span class="ico">🔄</span> Réconciliation</div>
|
||
<div class="sb-item" onclick="askQ('aide')"><span class="ico">❓</span> Aide (294 intents)</div>
|
||
</div>
|
||
</div>
|
||
<div class="sb-section">
|
||
<div class="sb-title">⚡ Quick Actions</div>
|
||
<div class="sb-item" onclick="askQ('comment va le systeme')"><span class="ico">💚</span> System status</div>
|
||
<div class="sb-item" onclick="askQ('lance nonreg')"><span class="ico">🧪</span> NonReg tests</div>
|
||
<div class="sb-item" onclick="askQ('push all')"><span class="ico">📤</span> Git push</div>
|
||
<div class="sb-item" onclick="askQ('l99 master dashboard')"><span class="ico">📊</span> Dashboard L99</div>
|
||
<div class="sb-item" onclick="askQ('etat des hubs')"><span class="ico">🏢</span> Hubs status</div>
|
||
<div class="sb-item" onclick="askQ('provider cascade status')"><span class="ico">🔗</span> Cascade status</div>
|
||
<div class="sb-item" onclick="askQ('scan web IA souveraine')"><span class="ico">🌐</span> Web scan</div>
|
||
<div class="sb-item" onclick="askQ('genere un ERP complet')"><span class="ico">🏭</span> Code Agent ERP</div>
|
||
</div>
|
||
<div class="sb-section">
|
||
<div class="sb-title">📁 Register</div>
|
||
<div id="registerInfo" style="font-size:11px;color:var(--fg3)">Chargement...</div>
|
||
</div>
|
||
<div class="sb-section" style="flex:1">
|
||
<div class="sb-title">💬 Historique</div>
|
||
<div id="historyList"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- MAIN CHAT -->
|
||
<div class="main">
|
||
<div class="chat" id="chat">
|
||
<div class="welcome" id="welcome">
|
||
<h1>WEVAL Arena</h1>
|
||
<p>Command Center IA Souveraine — 394 options · 394 providers · 385 skills · 4 serveurs
|
||
API + WebChat + OSS + Arsenal + Hubs + Skills + Budget + 9 couches IA</p>
|
||
<div class="welcome-grid">
|
||
<div class="wg-card" onclick="askQ('analyse SWOT de WEVAL')"><div class="wg-ico">📊</div><div class="wg-txt">SWOT</div></div>
|
||
<div class="wg-card" onclick="askQ('ecris un script python pour scraper')"><div class="wg-ico">🐍</div><div class="wg-txt">Python</div></div>
|
||
<div class="wg-card" onclick="askQ('genere un docker-compose redis postgres')"><div class="wg-ico">🐳</div><div class="wg-txt">Docker</div></div>
|
||
<div class="wg-card" onclick="askQ('fiche de poste developpeur fullstack')"><div class="wg-ico">👤</div><div class="wg-txt">RH</div></div>
|
||
<div class="wg-card" onclick="askQ('genere un NDA')"><div class="wg-ico">📜</div><div class="wg-txt">Juridique</div></div>
|
||
<div class="wg-card" onclick="askQ('plan marketing digital')"><div class="wg-ico">📢</div><div class="wg-txt">Marketing</div></div>
|
||
<div class="wg-card" onclick="askQ('architecture microservices event-driven')"><div class="wg-ico">🏗️</div><div class="wg-txt">Architecture</div></div>
|
||
<div class="wg-card" onclick="askQ('business plan startup IA')"><div class="wg-ico">💰</div><div class="wg-txt">Business Plan</div></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="input-area">
|
||
<div class="modes">
|
||
<button class="mode toggle deepthink" id="togThink" onclick="toggleMode('think')">🧠 DeepThink</button>
|
||
<button class="mode toggle search" id="togSearch" onclick="toggleMode('search')">🔍 Search</button>
|
||
<button class="mode toggle" id="togDual" onclick="toggleDual()" style="border-color:#f59e0b;color:#f59e0b">⚡ Think+Search</button>
|
||
<span style="width:1px;background:var(--bd);margin:0 4px"></span>
|
||
<button class="mode expert" id="mExpert" onclick="setExpert('expert')">🎓 Expert</button>
|
||
<button class="mode code" id="mCode" onclick="setExpert('code')">💻 Code</button>
|
||
<button class="mode creative" id="mCreative" onclick="setExpert('creative')">✨ Creative</button>
|
||
<span style="flex:1"></span>
|
||
<span id="modeLabel" style="font-size:10px;color:var(--fg3);align-self:center">Mode: Normal</span>
|
||
</div>
|
||
<div class="input-row">
|
||
<textarea class="input-box" id="inp" placeholder="Message WEVAL Arena... (Enter pour envoyer)" rows="1" onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();send()}"></textarea>
|
||
<button class="send" id="sendBtn" onclick="send()"><svg viewBox="0 0 24 24"><path d="M2 21l21-9L2 3v7l15 2-15 2v7z"/></svg></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- RIGHT PANEL -->
|
||
<div class="panel" id="panel">
|
||
<div class="pn-section">
|
||
<div class="pn-title">📊 System Live</div>
|
||
<div class="pn-grid">
|
||
<div class="pn-kpi"><div class="pn-kpi-v" style="color:var(--cy)" id="kpiNR">—</div><div class="pn-kpi-l">NonReg</div></div>
|
||
<div class="pn-kpi"><div class="pn-kpi-v" style="color:var(--gn)" id="kpiState">—</div><div class="pn-kpi-l">State</div></div>
|
||
<div class="pn-kpi"><div class="pn-kpi-v" style="color:var(--vi)" id="kpiIntents">—</div><div class="pn-kpi-l">Intents</div></div>
|
||
<div class="pn-kpi"><div class="pn-kpi-v" style="color:var(--bl)" id="kpiDocker">—</div><div class="pn-kpi-l">Docker</div></div>
|
||
</div>
|
||
</div>
|
||
<div class="pn-section">
|
||
<div class="pn-title">🔗 Cascade Providers</div>
|
||
<div id="providerList"></div>
|
||
</div>
|
||
<div class="pn-section">
|
||
<div class="pn-title">🧪 Tests</div>
|
||
<div id="testList"></div>
|
||
</div>
|
||
<div class="pn-section">
|
||
<div class="pn-title">🎯 Master Actions</div>
|
||
<button class="pn-action" onclick="masterExec('reconcilie tout')">🔄 Réconcilier</button>
|
||
<button class="pn-action" onclick="masterExec('lance nonreg')">🧪 Lancer NonReg</button>
|
||
<button class="pn-action" onclick="masterExec('push all')">📤 Push All</button>
|
||
<button class="pn-action" onclick="masterExec('backup gold')">💾 Backup GOLD</button>
|
||
<button class="pn-action" onclick="masterExec('wiki sync')">📚 Wiki Sync</button>
|
||
<button class="pn-action" onclick="masterExec('l99 state refresh')">🔄 State Refresh</button>
|
||
<button class="pn-action" onclick="masterExec('check subdomains')">🌐 Check Subdomains</button>
|
||
<button class="pn-action" onclick="masterExec('scan seo')">📈 SEO Scan</button>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
let thinkOn=false,searchOn=false,expertMode='',currentModel='auto',history=[],busy=false;
|
||
|
||
function toggleDual(){
|
||
thinkOn=true;searchOn=true;
|
||
document.getElementById('togThink').classList.add('on');
|
||
document.getElementById('togSearch').classList.add('on');
|
||
document.getElementById('togDual').classList.add('on');
|
||
document.getElementById('togDual').style.background='#f59e0b15';
|
||
updateModeLabel();
|
||
}
|
||
function toggleMode(m){
|
||
if(m==='think'){thinkOn=!thinkOn;document.getElementById('togThink').classList.toggle('on',thinkOn)}
|
||
if(m==='search'){searchOn=!searchOn;document.getElementById('togSearch').classList.toggle('on',searchOn)}
|
||
updateModeLabel();
|
||
}
|
||
function setExpert(m){
|
||
if(expertMode===m){expertMode='';document.querySelectorAll('.mode.expert,.mode.code,.mode.creative').forEach(b=>b.classList.remove('on'))}
|
||
else{expertMode=m;document.querySelectorAll('.mode.expert,.mode.code,.mode.creative').forEach(b=>b.classList.remove('on'));document.getElementById('m'+m.charAt(0).toUpperCase()+m.slice(1)).classList.add('on')}
|
||
updateModeLabel();
|
||
}
|
||
function getMode(){
|
||
if(expertMode) return expertMode;
|
||
if(thinkOn&&searchOn) return 'deepthink-search';
|
||
if(thinkOn) return 'deepthink';
|
||
if(searchOn) return 'search';
|
||
return 'instant';
|
||
}
|
||
function updateModeLabel(){
|
||
const m=getMode();
|
||
const labels={'instant':'Normal','deepthink':'🧠 DeepThink','search':'🔍 Search','deepthink-search':'🧠+🔍 Think+Search','expert':'🎓 Expert','code':'💻 Code','creative':'✨ Creative'};
|
||
document.getElementById('modeLabel').textContent='Mode: '+(labels[m]||m);
|
||
}
|
||
|
||
|
||
function askQ(q){document.getElementById('inp').value=q;send()}
|
||
function clearChat(){history=[];document.getElementById('chat').innerHTML='<div class="welcome" id="welcome"><h1>WEVAL Arena</h1><p>Command Center — 30 modèles, KB + Wiki + Master connectés</p></div>'}
|
||
|
||
function addMsg(role,content,meta){
|
||
const w=document.getElementById('welcome');if(w)w.remove();
|
||
const chat=document.getElementById('chat'),div=document.createElement('div');
|
||
div.className=`msg ${role}`;
|
||
let html=content.replace(/```(\w*)\n([\s\S]*?)```/g,'<pre><code>$2</code></pre>').replace(/`([^`]+)`/g,'<code>$1</code>').replace(/\*\*([^*]+)\*\*/g,'<strong>$1</strong>').replace(/\n/g,'<br>');
|
||
let metaHtml='';
|
||
if(meta && (meta.thinking || meta.has_thinking)){
|
||
html='<details style="background:var(--bg);border:1px solid var(--vi)33;border-radius:8px;padding:10px;margin-bottom:10px;cursor:pointer"><summary style="color:var(--vi);font-weight:600;font-size:12px">🧠 Thought for '+(meta.latency_ms?Math.round(meta.latency_ms/1000):'?')+'s</summary><div style="font-size:11px;color:var(--fg3);margin-top:6px;line-height:1.5">'+(meta.thinking||'Raisonnement en cours...').slice(0,800).replace(/\n/g,'<br>')+'</div></details>'+html;
|
||
}
|
||
if(meta){metaHtml=`<div class="msg-meta"><span class="prov">${meta.provider||''}</span><span>${meta.model||''}</span><span>${meta.latency_ms||''}ms</span><span>${meta.tokens||''}tok</span><span>${meta.cost||'0€'}</span></div>`}
|
||
div.innerHTML=`<div class="msg-av">${role==='bot'?'🧠':'👤'}</div><div class="msg-body">${html}${metaHtml}</div>`;
|
||
chat.appendChild(div);chat.scrollTop=chat.scrollHeight;
|
||
// Save to sidebar history
|
||
if(role==='user'){
|
||
const hl=document.getElementById('historyList');
|
||
const hi=document.createElement('div');hi.className='sb-item';hi.innerHTML=`<span class="ico">💬</span>${content.slice(0,30)}...`;
|
||
hi.onclick=()=>{document.getElementById('inp').value=content;send()};
|
||
hl.prepend(hi);if(hl.children.length>15)hl.lastChild.remove();
|
||
}
|
||
}
|
||
|
||
function addLoading(){
|
||
const chat=document.getElementById('chat'),div=document.createElement('div');
|
||
div.className='msg bot';div.id='loading';
|
||
const cm=getMode();const labels={instant:'⚡ Génération...',deepthink:'🧠 Raisonnement profond...',search:'🔍 Recherche + analyse...',expert:'🎓 Analyse experte...',code:'💻 Compilation...',creative:'✨ Création...'};
|
||
div.innerHTML=`<div class="msg-av">🧠</div><div class="msg-body"><div class="loading"><span></span><span></span><span></span></div><div class="msg-meta"><span>${labels[cm]||cm}</span></div></div>`;
|
||
chat.appendChild(div);chat.scrollTop=chat.scrollHeight;
|
||
}
|
||
|
||
async function send(){
|
||
if(busy)return;const inp=document.getElementById('inp'),msg=inp.value.trim();if(!msg)return;
|
||
inp.value='';inp.style.height='auto';busy=true;document.getElementById('sendBtn').disabled=true;
|
||
addMsg('user',msg);history.push({role:'user',content:msg});addLoading();
|
||
try{
|
||
const _ep=(()=>{const m=currentModel||'auto';const np=['cf-','nim-','or-','groq','cerebras','mistral','ollama','web-'];if(np.some(p=>m.startsWith(p)))return'/api/wevia-multi-provider.php';return'/api/wevia-deepseek-proxy.php';})();const res=await fetch(_ep,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:msg,mode:getMode(),model:currentModel,history:history.slice(-12)})});
|
||
/* HTML_GUARD_V2_BATCH */ const _t_data=await res.text(); let data=null; {var _q=(_t_data||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){data={error:"[HTTP "+(res.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{data=JSON.parse(_q)}catch(e){data={error:"[JSON] "+e.message}}}}document.getElementById('loading')?.remove();
|
||
if(data.content){addMsg('bot',data.content,data);history.push({role:'assistant',content:data.content})}
|
||
else addMsg('bot',data.error||'Erreur','Error');
|
||
}catch(e){document.getElementById('loading')?.remove();addMsg('bot','Erreur: '+e.message)}
|
||
busy=false;document.getElementById('sendBtn').disabled=false;inp.focus();
|
||
}
|
||
|
||
async function masterExec(cmd){
|
||
addMsg('user','[Master] '+cmd);addLoading();
|
||
try{
|
||
const res=await fetch('/api/wevia-full-exec.php?m='+encodeURIComponent(cmd));
|
||
/* HTML_GUARD_V2_BATCH */ const _t_data=await res.text(); const data=null; {var _q=(_t_data||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){data={error:"[HTTP "+(res.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{data=JSON.parse(_q)}catch(e){data={error:"[JSON] "+e.message}}}}document.getElementById('loading')?.remove();
|
||
addMsg('bot',data.response||data.content||'OK',{provider:'WEVIA Master',model:'intent-exec'});
|
||
}catch(e){document.getElementById('loading')?.remove();addMsg('bot','Erreur Master: '+e.message)}
|
||
}
|
||
|
||
async function searchKB(){
|
||
const q=document.getElementById('kbSearch').value.trim();if(!q)return;
|
||
const div=document.getElementById('kbResults');div.innerHTML='<div style="color:var(--fg3);font-size:11px">Recherche...</div>';
|
||
try{
|
||
const res=await fetch('/api/wevia-full-exec.php?m='+encodeURIComponent('cherche kb '+q));
|
||
/* HTML_GUARD_V2_BATCH */ const _t_data=await res.text(); const data=null; {var _q=(_t_data||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){data={error:"[HTTP "+(res.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{data=JSON.parse(_q)}catch(e){data={error:"[JSON] "+e.message}}}}
|
||
div.innerHTML=`<div class="sb-item" style="font-size:11px;white-space:pre-wrap">${(data.response||'Aucun résultat').slice(0,300)}</div>`;
|
||
}catch(e){div.innerHTML='<div style="color:var(--rd);font-size:11px">Erreur</div>'}
|
||
}
|
||
|
||
async function loadSystemData(){
|
||
try{
|
||
// State
|
||
const stRes=await fetch('/api/l99-state.json?t='+Date.now());
|
||
/* HTML_GUARD_V2_BATCH */ const _t_st=await stRes.text(); const st=null; {var _q=(_t_st||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){st={error:"[HTTP "+(stRes.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{st=JSON.parse(_q)}catch(e){st={error:"[JSON] "+e.message}}}}
|
||
document.getElementById('kpiNR').textContent=(st.nonreg_pass||'?')+'/'+(st.nonreg_total||'?');
|
||
document.getElementById('kpiState').textContent=(st.pass||'?')+'/'+(st.total||'?');
|
||
document.getElementById('kpiDocker').textContent=st.docker_up||'?';
|
||
document.getElementById('kpiIntents').textContent=st.intents||'?';
|
||
// Register
|
||
document.getElementById('registerInfo').innerHTML=`Pages: ${st.pages_html||'?'}<br>APIs: ${st.apis_php||'?'}<br>Screenshots: ${st.screenshots||'?'}<br>Videos: ${st.videos||'?'}`;
|
||
}catch(e){}
|
||
try{
|
||
// Source of truth
|
||
const sotRes=await fetch('/api/source-of-truth.json?t='+Date.now());
|
||
/* HTML_GUARD_V2_BATCH */ const _t_sot=await sotRes.text(); const sot=null; {var _q=(_t_sot||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){sot={error:"[HTTP "+(sotRes.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{sot=JSON.parse(_q)}catch(e){sot={error:"[JSON] "+e.message}}}}
|
||
const scores=sot.scores||{};
|
||
const testDiv=document.getElementById('testList');
|
||
let th='';
|
||
for(const[k,v]of Object.entries(scores)){
|
||
const pct=parseInt(v)||0;const col=pct>=99?'var(--cy)':pct>=95?'var(--go)':'var(--rd)';
|
||
th+=`<div class="pn-card"><div class="pn-card-h"><span class="pn-card-n">${k}</span><span class="pn-card-s" style="color:${col}">${v}</span></div><div class="pn-bar"><div class="pn-bar-f" style="width:${Math.min(pct,100)}%;background:${col}"></div></div></div>`;
|
||
}
|
||
testDiv.innerHTML=th||'<div style="color:var(--fg3);font-size:11px">Chargement...</div>';
|
||
}catch(e){}
|
||
// Providers
|
||
const provs=['Groq','Cerebras','SambaNova','Gemini','Mistral','DeepSeek','OpenRouter','Anthropic','Ollama','DeepSeek Web'];
|
||
const pDiv=document.getElementById('providerList');
|
||
pDiv.innerHTML=provs.map(p=>`<div class="sb-item"><span class="ico" style="color:var(--cy)">●</span>${p}</div>`).join('');
|
||
}
|
||
|
||
document.getElementById('inp').addEventListener('input',function(){this.style.height='auto';this.style.height=Math.min(this.scrollHeight,180)+'px'});
|
||
|
||
// DeepSeek Web Connection
|
||
async function connectDS() {
|
||
const token = prompt("CONNECTER DeepSeek Web UNLIMITED:\n\n1. Ouvrir chat.deepseek.com (deja connecte)\n2. F12 > Console\n3. Coller: copy(document.cookie)\n4. Coller le cookie ici:");
|
||
if (!token || token.length < 10) return;
|
||
try {
|
||
const res = await fetch('/api/wevia-deepseek-proxy.php', {
|
||
method: 'POST',
|
||
headers: {'Content-Type': 'application/json'},
|
||
body: JSON.stringify({action: 'set_ds_token', token: token})
|
||
});
|
||
/* HTML_GUARD_V2_BATCH */ const _t_data=await res.text(); const data=null; {var _q=(_t_data||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){data={error:"[HTTP "+(res.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{data=JSON.parse(_q)}catch(e){data={error:"[JSON] "+e.message}}}}
|
||
if (data.status === 'token_saved') {
|
||
document.getElementById('dsConnect').style.background = 'var(--cy)22';
|
||
document.getElementById('dsConnect').style.borderColor = 'var(--cy)';
|
||
document.getElementById('dsConnect').style.color = 'var(--cy)';
|
||
document.getElementById('dsConnect').textContent = '✅ DeepSeek Connecte';
|
||
alert('DeepSeek Web UNLIMITED active! Token sauvegarde (' + data.length + ' chars)');
|
||
} else {
|
||
alert('Erreur: ' + JSON.stringify(data));
|
||
}
|
||
} catch(e) { alert('Erreur: ' + e); }
|
||
}
|
||
|
||
// Check DS token on load
|
||
async function checkDS() {
|
||
try {
|
||
const res = await fetch('/api/wevia-deepseek-proxy.php', {
|
||
method: 'POST',
|
||
headers: {'Content-Type': 'application/json'},
|
||
body: JSON.stringify({action: 'ds_token_status'})
|
||
});
|
||
/* HTML_GUARD_V2_BATCH */ const _t_data=await res.text(); const data=null; {var _q=(_t_data||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){data={error:"[HTTP "+(res.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{data=JSON.parse(_q)}catch(e){data={error:"[JSON] "+e.message}}}}
|
||
if (data.has_token) {
|
||
document.getElementById('dsConnect').style.background = 'var(--cy)22';
|
||
document.getElementById('dsConnect').style.borderColor = 'var(--cy)';
|
||
document.getElementById('dsConnect').style.color = 'var(--cy)';
|
||
document.getElementById('dsConnect').textContent = '✅ DeepSeek Connecte';
|
||
}
|
||
} catch(e) {}
|
||
}
|
||
checkDS();
|
||
|
||
loadSystemData();setInterval(loadSystemData,60000);
|
||
|
||
// Arena Health Check — colors models green/red
|
||
async function checkArenaHealth() {
|
||
try {
|
||
const ctrl = new AbortController();
|
||
setTimeout(() => ctrl.abort(), 90000);
|
||
const r = await fetch("/api/wevia-arena-health.php", {signal: ctrl.signal});
|
||
/* HTML_GUARD_V2_BATCH */ const _t_d=await r.text(); let d=null; {var _q=(_t_d||"").trim();if(_q.startsWith("<!DOCTYPE")||_q.startsWith("<html")){d={error:"[HTTP "+(r.status||"?")+"] Backend indisponible",isHtmlError:true};}else{try{d=JSON.parse(_q)}catch(e){d={error:"[JSON] "+e.message}}}}
|
||
const sel = document.getElementById("modelSelect");
|
||
if (!sel || !d.models) return;
|
||
|
||
// Update status badge
|
||
const badge = document.getElementById("healthBadge");
|
||
if (badge) {
|
||
badge.textContent = d.alive + "/" + d.total + " ALIVE";
|
||
badge.style.color = d.pct >= 80 ? "#00e5ff" : d.pct >= 50 ? "#ffcc33" : "#ff4444";
|
||
}
|
||
|
||
// Color options
|
||
d.models.forEach(m => {
|
||
const opt = sel.querySelector(`option[value="${m.model}"]`);
|
||
if (opt) {
|
||
if (m.status === "alive") {
|
||
opt.textContent = "🟢 " + opt.textContent.replace(/^[🟢🔴⚪] /, "");
|
||
} else {
|
||
opt.textContent = "🔴 " + opt.textContent.replace(/^[🟢🔴⚪] /, "") + " [" + (m.error || "?").substring(0, 20) + "]";
|
||
}
|
||
}
|
||
});
|
||
} catch(e) { console.log("health:", e); }
|
||
}
|
||
// Check on load + every 5 min
|
||
setTimeout(checkArenaHealth, 2000);
|
||
setInterval(checkArenaHealth, 300000);
|
||
|
||
|
||
// Dropdown search filter
|
||
document.getElementById("modelSelect").addEventListener("focus", function() {
|
||
if (document.getElementById("ddFilter")) return;
|
||
const wrap = this.parentElement;
|
||
const inp = document.createElement("input");
|
||
inp.id = "ddFilter";
|
||
inp.placeholder = "🔍 Filtrer...";
|
||
inp.style.cssText = "width:100%;padding:6px 10px;background:var(--bg2);border:1px solid var(--bd);border-radius:6px;color:var(--fg);font-size:12px;margin-bottom:4px;outline:none;";
|
||
wrap.insertBefore(inp, this);
|
||
inp.focus();
|
||
inp.oninput = function() {
|
||
const q = this.value.toLowerCase();
|
||
const opts = document.getElementById("modelSelect").options;
|
||
const grps = document.getElementById("modelSelect").querySelectorAll("optgroup");
|
||
grps.forEach(g => {
|
||
let vis = 0;
|
||
Array.from(g.children).forEach(o => {
|
||
const show = o.textContent.toLowerCase().includes(q) || o.value.includes(q);
|
||
o.style.display = show ? "" : "none";
|
||
if (show) vis++;
|
||
});
|
||
g.style.display = vis ? "" : "none";
|
||
});
|
||
};
|
||
inp.onblur = function() { setTimeout(() => this.remove(), 200); };
|
||
});
|
||
|
||
</script>
|
||
</body>
|
||
</html>
|