diff --git a/api/ambre-ext-probe.php b/api/ambre-ext-probe.php new file mode 100644 index 000000000..2deebe5b9 --- /dev/null +++ b/api/ambre-ext-probe.php @@ -0,0 +1,27 @@ +["timeout"=>3]])); +$od = @json_decode($ol, true); +$out["ollama_models"] = is_array($od) ? array_map(function($m){return $m["name"];}, $od["models"] ?? []) : []; + +// Paperclip health/API +$pc = @file_get_contents("http://127.0.0.1:3201/", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]])); +$out["paperclip_first"] = substr($pc ?? "", 0, 200); + +// DeerFlow api probe +$df = @file_get_contents("http://127.0.0.1:3002/api/health", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]])); +$out["deerflow_health"] = substr($df ?? "", 0, 150); + +// Cascade providers health (all 13) +$ch = @file_get_contents("http://127.0.0.1:4000/health", false, stream_context_create(["http"=>["timeout"=>3]])); +$cd = @json_decode($ch, true); +$out["cascade_providers"] = is_array($cd) ? ($cd["providers"] ?? $cd) : $ch; + +// L99 (S95 arsenal) probe +$l99 = @file_get_contents("http://127.0.0.1:5890/api/l99-health.php", false, stream_context_create(["http"=>["timeout"=>3,"ignore_errors"=>true]])); +$out["l99_health"] = substr($l99 ?? "", 0, 150); + +echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES); diff --git a/api/ambre-multiagent-v2-external.php b/api/ambre-multiagent-v2-external.php new file mode 100644 index 000000000..d24f0c02b --- /dev/null +++ b/api/ambre-multiagent-v2-external.php @@ -0,0 +1,213 @@ +"goal required"]); exit; } + +$t0 = microtime(true); + +// PLAN with richer agent diversity +$plan_sys = "Tu es un planificateur multi-agent WEVAL. Pour l'objectif donné, génère UN JSON STRICT :\n" . + "{\n" . + ' "objective": "",' . "\n" . + ' "agents": [' . "\n" . + ' {"role":"", "task":"", "tool":"", "model_hint":""},' . "\n" . + " ...\n" . + " ]\n" . + "}\n" . + "Tools disponibles:\n" . + "- llm_fast (Cerebras/Groq rapide)\n" . + "- llm_think (Cerebras think raisonnement profond)\n" . + "- llm_ollama (local qwen3/llama3.2 souverain)\n" . + "- pdf_premium (génère PDF 5 pages)\n" . + "- mermaid (diagramme SVG)\n" . + "- web_search (recherche web)\n" . + "- kb_search (mémoire partagée)\n" . + "- calc (calcul)\n" . + "Max $max_agents agents · roles variés · tools diversifiés pour parallélisme optimal."; + +$plan_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([ + "http" => ["method"=>"POST","header"=>"Content-Type: application/json\r\n", + "content"=>json_encode(["model"=>"fast","messages"=>[["role"=>"system","content"=>$plan_sys],["role"=>"user","content"=>"Objectif: $goal"]],"max_tokens"=>1000,"temperature"=>0.4]), + "timeout"=>25], +])); +$pd = @json_decode($plan_raw, true); +$pt = $pd["choices"][0]["message"]["content"] ?? ""; +$pt = preg_replace('/^```(?:json)?\s*/m', '', $pt); +$pt = preg_replace('/\s*```\s*$/m', '', trim($pt)); +$plan = @json_decode($pt, true); + +if (!$plan || !isset($plan["agents"])) { + echo json_encode(["error"=>"plan invalid", "raw"=>substr($pt, 0, 400)]); + exit; +} + +$plan_ms = round((microtime(true)-$t0)*1000); + +// EXECUTE +$agents = array_slice($plan["agents"], 0, $max_agents); +$mh = curl_multi_init(); +$handles = []; + +foreach ($agents as $i => $agent) { + $tool = strtolower($agent["tool"] ?? "llm_fast"); + $task = $agent["task"] ?? ""; + $ch = curl_init(); + + if ($tool === "llm_ollama") { + // Ollama LOCAL sovereign (qwen3:4b fastest) + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1:11434/api/generate", + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["model"=>"qwen3:4b","prompt"=>$task,"stream"=>false,"options"=>["num_predict"=>400]]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_CONNECTTIMEOUT => 3, + ]); + } elseif ($tool === "llm_think") { + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions", + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["model"=>"think","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>500]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 45, CURLOPT_CONNECTTIMEOUT => 3, + ]); + } elseif ($tool === "pdf_premium") { + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-pdf-premium.php", + CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 50, CURLOPT_CONNECTTIMEOUT => 3, + ]); + } elseif ($tool === "mermaid") { + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-mermaid.php", + CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["topic"=>$task]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20, CURLOPT_CONNECTTIMEOUT => 3, + ]); + } elseif ($tool === "web_search") { + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-web-search.php", + CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["query"=>$task]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3, + ]); + } elseif ($tool === "kb_search") { + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1/api/ambre-mermaid-learn.php", + CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["action"=>"search","query"=>$task]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3, + ]); + } elseif ($tool === "calc") { + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1/api/ambre-tool-calc.php", + CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["expression"=>$task]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3, + ]); + } else { + // default = llm_fast (Cerebras) + curl_setopt_array($ch, [ + CURLOPT_URL => "http://127.0.0.1:4000/v1/chat/completions", + CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode(["model"=>"fast","messages"=>[["role"=>"user","content"=>$task]],"max_tokens"=>400]), + CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3, + ]); + $tool = "llm_fast"; + } + + curl_multi_add_handle($mh, $ch); + $handles[$i] = ["ch"=>$ch, "agent"=>$agent, "tool_used"=>$tool, "t0"=>microtime(true)]; +} + +$exec_t0 = microtime(true); +$running = null; +do { curl_multi_exec($mh, $running); curl_multi_select($mh, 0.5); } while ($running > 0); + +$results = []; +foreach ($handles as $i => $h) { + $output = curl_multi_getcontent($h["ch"]); + $http = curl_getinfo($h["ch"], CURLINFO_HTTP_CODE); + $ems = round((microtime(true)-$h["t0"])*1000); + curl_multi_remove_handle($mh, $h["ch"]); + curl_close($h["ch"]); + + $d = @json_decode($output, true); + $summary = ""; + if ($d) { + if (isset($d["mermaid_code"])) $summary = "📊 Mermaid " . strlen($d["mermaid_code"]) . "B · source=" . ($d["source"] ?? "?"); + elseif (isset($d["url"])) $summary = "📄 " . $d["url"] . " · " . ($d["size_kb"] ?? "?") . "KB"; + elseif (isset($d["choices"][0]["message"]["content"])) $summary = substr($d["choices"][0]["message"]["content"], 0, 350); + elseif (isset($d["response"])) $summary = substr($d["response"], 0, 350); + elseif (isset($d["answer"])) $summary = substr($d["answer"], 0, 350); + elseif (isset($d["result"])) $summary = (string)$d["result"]; + else $summary = substr($output, 0, 200); + } else $summary = substr($output ?: "empty", 0, 200); + + $results[] = [ + "agent" => $h["agent"]["role"] ?? "agent_$i", + "task" => $h["agent"]["task"] ?? "", + "tool" => $h["tool_used"], + "http" => $http, + "elapsed_ms" => $ems, + "summary" => $summary, + ]; +} +curl_multi_close($mh); +$exec_ms = round((microtime(true)-$exec_t0)*1000); + +// RECONCILE via Groq (souverain non-Cerebras pour diversité) +$synth_input = "Objectif: $goal\n\nRésultats " . count($results) . " agents :\n"; +foreach ($results as $r) { + $synth_input .= "• " . $r["agent"] . " (tool=" . $r["tool"] . ", " . $r["elapsed_ms"] . "ms): " . substr($r["summary"], 0, 250) . "\n"; +} +$synth_input .= "\nProduis une synthèse finale en français, structurée, actionnable. Max 300 mots."; + +$synth_raw = @file_get_contents("http://127.0.0.1:4000/v1/chat/completions", false, stream_context_create([ + "http"=>["method"=>"POST","header"=>"Content-Type: application/json\r\n", + "content"=>json_encode(["model"=>"fast","messages"=>[["role"=>"user","content"=>$synth_input]],"max_tokens"=>600]), + "timeout"=>20], +])); +$sd = @json_decode($synth_raw, true); +$reconciled = $sd["choices"][0]["message"]["content"] ?? "synthèse échouée"; + +// Register in learning pool +$shared_kb_file = "/opt/wevads/internal-memory/_shared-learning.json"; +$shared_kb = @json_decode(@file_get_contents($shared_kb_file), true) ?: []; +$shared_kb[] = [ + "ts" => time(), "source" => "multiagent-v2", + "topic" => $plan["objective"] ?? $goal, + "synthesis_preview" => substr($reconciled, 0, 300), + "agents" => count($results), +]; +if (count($shared_kb) > 500) $shared_kb = array_slice($shared_kb, -500); +@file_put_contents($shared_kb_file, json_encode($shared_kb, JSON_UNESCAPED_UNICODE)); + +echo json_encode([ + "ok" => true, + "goal" => $goal, + "plan" => $plan, + "plan_ms" => $plan_ms, + "results" => $results, + "exec_ms" => $exec_ms, + "parallel_speedup" => round(array_sum(array_column($results, "elapsed_ms")) / max($exec_ms, 1), 2), + "reconciled" => trim($reconciled), + "total_ms" => round((microtime(true)-$t0)*1000), + "agents_count" => count($results), + "tools_diversity" => count(array_unique(array_column($results, "tool"))), + "provider" => "WEVIA Multi-Agent V2 · external IA dispatch · wave-260", + "shared_kb_size" => count($shared_kb), +], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE); diff --git a/api/ambre-scan-w260.php b/api/ambre-scan-w260.php new file mode 100644 index 000000000..7eab6e534 --- /dev/null +++ b/api/ambre-scan-w260.php @@ -0,0 +1,68 @@ +&1 | head -10")))); +$out["recent_commits"] = array_filter(array_map("trim", explode("\n", @shell_exec("git log --since='30 minutes ago' --oneline 2>&1 | head -12")))); + +// External AIs/agents available on this server (L99, Director, Blade, Arena, AlliaHub, Paperclip, DeerFlow) +$ext_agents = [ + "L99" => "http://127.0.0.1:5890", // S95 arsenal + "Paperclip" => "http://127.0.0.1:3201", + "DeerFlow" => "http://127.0.0.1:3002", + "MiroFish" => "http://127.0.0.1:3050", + "TwentyCRM" => "http://127.0.0.1:3000", + "n8n" => "http://127.0.0.1:5678", + "Ollama" => "http://127.0.0.1:11434", + "Qdrant" => "http://127.0.0.1:6333", + "Cascade" => "http://127.0.0.1:4000", + "Mattermost" => "http://127.0.0.1:8065", +]; +$out["external_agents"] = []; +foreach ($ext_agents as $n => $url) { + $t0 = microtime(true); + $r = @file_get_contents($url, false, stream_context_create(["http"=>["timeout"=>2,"ignore_errors"=>true]])); + $out["external_agents"][$n] = [ + "url" => $url, + "up" => (bool)$r, + "ms" => round((microtime(true)-$t0)*1000), + ]; +} + +// Check CF Transform Rules possibility (needs CF token working) +$cf_token = null; +if (file_exists("/etc/weval/secrets.env")) { + $sc = @file_get_contents("/etc/weval/secrets.env"); + if (preg_match("/CF_API_TOKEN=([^\n\"]+)/", $sc, $m)) $cf_token = trim($m[1]); +} +$out["cf_token_len"] = $cf_token ? strlen($cf_token) : 0; + +// Test CF token +if ($cf_token) { + $ctx = stream_context_create(["http"=>["method"=>"GET","header"=>"Authorization: Bearer $cf_token\r\n","timeout"=>5,"ignore_errors"=>true]]); + $verify = @file_get_contents("https://api.cloudflare.com/client/v4/user/tokens/verify", false, $ctx); + $v = @json_decode($verify, true); + $out["cf_token_status"] = $v["success"] ?? false; + $out["cf_token_msg"] = substr($verify ?? "none", 0, 200); +} + +// Registered chatbots needing memory wire +$out["pages_with_widget"] = []; +foreach (["wevia.html", "wevia-master.html", "all-ia-hub.html", "wevia-orchestrator.html", "director-chat.html", "l99-brain.html", "director-center.html", "paperclip.html", "agents-enterprise.html", "wevia-multiagent-dashboard.html"] as $p) { + $f = "/var/www/html/$p"; + if (file_exists($f)) { + $c = @file_get_contents($f); + $out["pages_with_widget"][$p] = [ + "size" => strlen($c), + "has_universal_widget" => strpos($c, "ambre-universal-chat.js") !== false, + "has_chat_api" => strpos($c, "chat-api") !== false || strpos($c, "session-chat") !== false, + ]; + } +} + +// Internal memory state now +$out["internal_memory_files"] = array_map("basename", glob("/opt/wevads/internal-memory/*.jsonl") ?: []); +$out["internal_memory_count"] = count($out["internal_memory_files"]); + +$out["load"] = trim(@shell_exec("uptime")); +echo json_encode($out, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES); diff --git a/api/wevia-factory.php b/api/wevia-factory.php index 0287c070e..33a884121 100644 --- a/api/wevia-factory.php +++ b/api/wevia-factory.php @@ -371,7 +371,7 @@ if ($action === 'manifest') { // ACTION: run (default) · MAX parallel multi-agent execution $message = trim($input['message'] ?? ($_GET['q'] ?? '')); $session = $input['session'] ?? 'fact-' . bin2hex(random_bytes(3)); -$max_agents = (int)($input['max_agents'] ?? 24); // WAVE_259_DEFAULT_24: default 24 (12 builtin + 12 custom) // default: all 12 builtins +$max_agents = (int)($input['max_agents'] ?? 30); // WAVE_260_DEFAULT_30: default 30 (12 builtin + 18 custom) // default: all 12 builtins if (!$message) { http_response_code(400); echo json_encode(['error'=>'message required']); exit; } diff --git a/director-center.html b/director-center.html index 86eab7945..41e346b8a 100644 --- a/director-center.html +++ b/director-center.html @@ -592,4 +592,5 @@ setInterval(loadData,30000); + diff --git a/growth-engine-v2.html b/growth-engine-v2.html index f6964a58f..78eb1f7b0 100644 --- a/growth-engine-v2.html +++ b/growth-engine-v2.html @@ -577,7 +577,7 @@ document.addEventListener('DOMContentLoaded',()=>{const s=document.createElement h += 'Pattern CLAUDE 7 phases (Thinking→Plan→Dispatch PARALLEL→Ground→Synthesize→Tests→Response)'; h += ''; h += ''; - h += ''; + h += ''; h += ''; // === WAVE 253 · WEVIA GROUNDED BADGE (anti-hallucination proof) === @@ -1163,7 +1163,7 @@ document.addEventListener('DOMContentLoaded',()=>{const s=document.createElement headers:{'Content-Type':'application/json'}, body: JSON.stringify({ message: "Audit complet global: solutions · leads · tasks · social · predict · enterprise · quality · infrastructure", - max_agents: 24, + max_agents: 30, session: "max-"+Date.now() }) }) @@ -1179,7 +1179,7 @@ document.addEventListener('DOMContentLoaded',()=>{const s=document.createElement var html = '
'; html += '🚀'; - html += '

MAX Parallel Launch · '+d.agents_parallel+' agents mobilisés (12 builtin + 12 custom)

'; + html += '

MAX Parallel Launch · '+d.agents_parallel+' agents mobilisés (12 builtin + 18 custom)

'; html += 'grade '+d.grade+''; html += ''+d.total_duration_ms+'ms total'; html += 'grounding '+d.grounding_pct+'%'; diff --git a/paperclip.html b/paperclip.html index 6618a55b0..61367e69c 100644 --- a/paperclip.html +++ b/paperclip.html @@ -185,4 +185,5 @@ h1{font-family:Orbitron;font-size:28px;color:#8b5cf6;margin-bottom:8px;letter-sp + \ No newline at end of file diff --git a/wevia-multiagent-dashboard.html b/wevia-multiagent-dashboard.html index ff5f695db..4554ff785 100644 --- a/wevia-multiagent-dashboard.html +++ b/wevia-multiagent-dashboard.html @@ -163,4 +163,5 @@ body{background:var(--bg);color:var(--t);font-family:-apple-system,'Segoe UI',sa
+ \ No newline at end of file