Compare commits
91 Commits
v169-opus-
...
v178-opus-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a5394fb8d | ||
|
|
8fbfe405eb | ||
|
|
5f1d70f34b | ||
|
|
0df7b0ae2e | ||
|
|
3be073bf3f | ||
|
|
87f60d2950 | ||
|
|
4f9bc8042e | ||
|
|
dcdb16390d | ||
|
|
b233fcb091 | ||
|
|
b23b2beba2 | ||
|
|
a532fccce9 | ||
|
|
63c7b1c87f | ||
|
|
9ae9f77eba | ||
|
|
ab7c0a5de4 | ||
|
|
a342476366 | ||
|
|
f06c06cc02 | ||
|
|
3cf272152f | ||
|
|
155cc70c08 | ||
|
|
97d47f088b | ||
|
|
747596d86c | ||
|
|
7a90f40565 | ||
|
|
69e8b3b6da | ||
|
|
88685c2837 | ||
|
|
a54e766b19 | ||
|
|
5fed3ac046 | ||
|
|
4e7c08713b | ||
|
|
352fd0ce52 | ||
|
|
5dbba6d246 | ||
|
|
bfcf2223c9 | ||
|
|
a204d31fcb | ||
|
|
e03b3ec9ac | ||
|
|
7c299f595a | ||
|
|
a52c7e0b0f | ||
|
|
fcdb2c7f82 | ||
|
|
e43516dbf4 | ||
|
|
5651b59e2c | ||
|
|
1f8e502eb1 | ||
|
|
e141e18936 | ||
|
|
c95a2ce4db | ||
|
|
083a7345ed | ||
|
|
b881c81736 | ||
|
|
805a45b94e | ||
|
|
770a5c92ac | ||
|
|
7b73186210 | ||
|
|
a9cb3be6d4 | ||
|
|
6930609507 | ||
|
|
c30c7f0e2e | ||
|
|
1c6db0c8e6 | ||
|
|
2d9cdf729b | ||
|
|
e0036f3aa6 | ||
|
|
661263ff5f | ||
|
|
d3fb4271f1 | ||
|
|
1d93c88237 | ||
|
|
c96cd3695b | ||
|
|
d64bf8f6d5 | ||
|
|
6a90d25915 | ||
|
|
a66f7e5e35 | ||
|
|
eb4d6a2bfd | ||
|
|
4ccd3ec9d7 | ||
|
|
cf58f3907a | ||
|
|
17fd5c8867 | ||
|
|
1777a6fd9a | ||
|
|
7044bc0f02 | ||
|
|
d47dad90c0 | ||
|
|
851ec98b28 | ||
|
|
de4026e86d | ||
|
|
42ac79b1ed | ||
|
|
fef90ef5bd | ||
|
|
9a84b0cccc | ||
|
|
7aba72df4a | ||
|
|
1bd2a1816b | ||
|
|
68c844cc52 | ||
|
|
af31149d88 | ||
|
|
1b1dd880a2 | ||
|
|
dbea8f6f92 | ||
|
|
a56e7dd55d | ||
|
|
97bc5d4801 | ||
|
|
9e9ee7c728 | ||
|
|
f90ae398db | ||
|
|
b19107392d | ||
|
|
4b129583de | ||
|
|
6d9618638c | ||
|
|
a189c8702c | ||
|
|
2e893a3ca2 | ||
|
|
969731b074 | ||
|
|
9a60d63c7d | ||
|
|
8f1eaf4358 | ||
|
|
ae7d83f1fa | ||
|
|
3f1d6e5ef6 | ||
|
|
4df0825337 | ||
|
|
e8fbf4f1ab |
@@ -1336,5 +1336,32 @@ setInterval(refreshStats,60000);
|
||||
<script>(function(){var p=window.location.pathname;var pub=["/","/index.html","/wevia.html","/wevia-widget.html","/enterprise-model.html","/wevia","/login","/register.html","/agents-archi.html","/wevia-meeting-rooms.html","/director-center.html","/director-chat.html","/l99-brain.html","/agents-fleet.html","/value-streaming.html","/architecture.html","/openclaw.html","/l99-saas.html","/admin-saas.html","/agents-goodjob.html","/ai-benchmark.html","/oss-discovery.html","/paperclip.html","/agents-3d.html","/agents-alive.html","/agents-enterprise.html","/agents-hd.html","/agents-iso3d.html","/agents-sim.html","/agents-valuechain.html","/avatar-picker.html"];var isPub=pub.indexOf(p)>=0||p.indexOf("/products/")===0||p.indexOf("/solutions/")===0||p.indexOf("/blog/")===0||p.indexOf("/service/")===0||p.indexOf("/marketplace")===0||p.indexOf("/contact")===0||p.indexOf("/tarifs")===0||p.indexOf("/news")===0;if(isPub||document.getElementById("weval-gl"))return;var a=document.createElement("a");a.id="weval-gl";a.href="/logout";a.textContent="Logout";a.style.cssText="position:fixed;top:10px;right:12px;z-index:99990;padding:5px 10px;background:rgba(30,30,50,0.7);color:rgba(200,210,230,0.8);border:1px solid rgba(100,100,140,0.3);border-radius:6px;font:500 11px system-ui,sans-serif;text-decoration:none;opacity:0.6;cursor:pointer;backdrop-filter:blur(6px);transition:all .15s";a.onmouseover=function(){this.style.opacity="1";this.style.background="rgba(239,68,68,0.85)";this.style.color="white"};a.onmouseout=function(){this.style.opacity="0.6";this.style.background="rgba(30,30,50,0.7)";this.style.color="rgba(200,210,230,0.8)"};document.body.appendChild(a)})()</script><script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
|
||||
<script src="/api/weval-feature-tracker.js" defer></script>
|
||||
<script src="/api/ambre-universal-chat.js" defer></script>
|
||||
|
||||
<!-- WAVE 265 · Factory pill cross-page (injected, position mesurée zéro overlap) -->
|
||||
<a id="w265-factory-cross" href="/wevia-multiagent-dashboard.html" title="Factory Health Monitor (30 agents)"
|
||||
style="position:fixed;top:12px;left:12px;padding:6px 12px;border-radius:14px;background:linear-gradient(135deg,rgba(34,211,238,.2),rgba(168,85,247,.15));border:1px solid rgba(34,211,238,.4);color:#67e8f9;font-size:11px;font-weight:700;text-decoration:none;display:inline-flex;align-items:center;gap:6px;z-index:9999;backdrop-filter:blur(10px);box-shadow:0 2px 8px rgba(0,0,0,.4)">
|
||||
<span>🏭</span>
|
||||
<span id="w265-factory-txt">Factory: ...</span>
|
||||
</a>
|
||||
<script>
|
||||
/* w265 Factory auto-load */
|
||||
(function(){
|
||||
async function refresh(){
|
||||
try {
|
||||
const r = await fetch('/api/wevia-v83-business-kpi.php?action=summary', {cache:'no-store'}).then(r=>r.json()).catch(()=>null);
|
||||
const el = document.getElementById('w265-factory-txt');
|
||||
if(el && r && r.summary){
|
||||
const s = r.summary;
|
||||
const pct = s.data_completeness_pct || 0;
|
||||
el.textContent = `Factory: ${pct}% (${s.ok || 0}/${s.total_kpis || 0})`;
|
||||
}
|
||||
} catch(e){ console.log('[w265] factory check err', e); }
|
||||
}
|
||||
refresh();
|
||||
setInterval(refresh, 60000);
|
||||
})();
|
||||
</script>
|
||||
<!-- /WAVE 265 Factory pill cross-page -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"agent": "V41_Disk_Monitor",
|
||||
"ts": "2026-04-22T11:00:01+02:00",
|
||||
"disk_pct": 86,
|
||||
"disk_free_gb": 22,
|
||||
"ts": "2026-04-22T16:30:01+02:00",
|
||||
"disk_pct": 87,
|
||||
"disk_free_gb": 20,
|
||||
"growth_per_day_gb": 1.5,
|
||||
"runway_days": 14,
|
||||
"runway_days": 13,
|
||||
"alert": "WARN_runway_under_30d",
|
||||
"action_auto_if_under_7d": "trigger_hetzner_volume_extension_api",
|
||||
"hetzner_volume_size_gb_recommended": 500,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_Risk_Escalation",
|
||||
"ts": "2026-04-22T11:00:03+02:00",
|
||||
"ts": "2026-04-22T16:45:02+02:00",
|
||||
"dg_alerts_active": 7,
|
||||
"wevia_life_stats_preview": "{
|
||||
"ok": true,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"routes": 446,
|
||||
"skills": 835,
|
||||
"wiki": 2252,
|
||||
"pages": 327,
|
||||
"wiki": 2296,
|
||||
"pages": 328,
|
||||
"apis": 254,
|
||||
"docker": 19,
|
||||
"proposals": [
|
||||
@@ -27,5 +27,5 @@
|
||||
"effort": "S"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-22 04:00"
|
||||
"timestamp": "2026-04-22 10:00"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 00:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"analysis": {
|
||||
"existing_skills": 835,
|
||||
"missing": 15,
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"agent": "V41_Feature_Adoption_Tracker",
|
||||
"ts": "2026-04-22T11:00:02+02:00",
|
||||
"ts": "2026-04-22T16:00:02+02:00",
|
||||
"features_tracked": 15,
|
||||
"features_used_24h": 12,
|
||||
"adoption_pct": 80,
|
||||
"chat_queries_last_1k_log": 9,
|
||||
"wtp_views_last_1k_log": 82,
|
||||
"dg_views_last_1k_log": 5,
|
||||
"skill_runs_last_1k_log": 0,
|
||||
"chat_queries_last_1k_log": 2,
|
||||
"wtp_views_last_1k_log": 9,
|
||||
"dg_views_last_1k_log": 0,
|
||||
"skill_runs_last_1k_log": 1,
|
||||
"recommendation": "UX onboarding tour for unused features",
|
||||
"cron_schedule": "hourly",
|
||||
"root_cause_resolved": "feature_adoption_rate via usage tracking + onboarding signals"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-22T11:10:03+02:00",
|
||||
"ts": "2026-04-22T16:50:04+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V41_MQL_Scoring",
|
||||
"ts": "2026-04-22T11:00:02+02:00",
|
||||
"ts": "2026-04-22T16:00:04+02:00",
|
||||
"leads_total": 48,
|
||||
"mql_current": 16,
|
||||
"sql_current": 6,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V60_Nudge_Owner_Actions",
|
||||
"ts": "2026-04-22T08:00:02+02:00",
|
||||
"ts": "2026-04-22T16:00:02+02:00",
|
||||
"cron": "every_8_hours",
|
||||
"actions_pending_owner": {
|
||||
"emails_drafts_V45_to_send": {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"agent": "V54_Risk_Monitor_Live",
|
||||
"ts": "2026-04-22T11:00:03+02:00",
|
||||
"ts": "2026-04-22T16:30:03+02:00",
|
||||
"critical_risks": {
|
||||
"RW01_pipeline_vide": {
|
||||
"pipeline_keur": 0,
|
||||
"mql_auto": 20,
|
||||
"residual_risk_pct": 80,
|
||||
"mql_auto": 19,
|
||||
"residual_risk_pct": 81,
|
||||
"trend": "mitigation_V42_V45_active"
|
||||
},
|
||||
"RW02_dependance_ethica": {
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"RW12_burnout": {
|
||||
"agents_cron_active": 15,
|
||||
"load_5min": "4.93",
|
||||
"load_5min": "15.72",
|
||||
"automation_coverage_pct": 70,
|
||||
"residual_risk_pct": 60,
|
||||
"trend": "V52_goldratt_options_active"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 10:00",
|
||||
"timestamp": "2026-04-22 16:00",
|
||||
"sections": {
|
||||
"servers": {
|
||||
"S204": {
|
||||
"docker": 20,
|
||||
"disk": "86%",
|
||||
"ram": "13Gi/30Gi",
|
||||
"load": "1.77",
|
||||
"uptime": "up 1 week, 22 hours, 8 minutes"
|
||||
"disk": "87%",
|
||||
"ram": "14Gi/30Gi",
|
||||
"load": "10.62",
|
||||
"uptime": "up 1 week, 1 day, 4 hours, 8 minutes"
|
||||
}
|
||||
},
|
||||
"docker": {
|
||||
@@ -20,12 +20,12 @@
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -60,7 +60,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -75,27 +75,27 @@
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -105,12 +105,12 @@
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
]
|
||||
@@ -488,7 +488,7 @@
|
||||
]
|
||||
},
|
||||
"pages": {
|
||||
"count": 327
|
||||
"count": 328
|
||||
},
|
||||
"opt_tools": {
|
||||
"count": 96
|
||||
@@ -497,7 +497,7 @@
|
||||
"pairs": 5751
|
||||
},
|
||||
"wiki": {
|
||||
"entries": 2296
|
||||
"entries": 2324
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,12 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T06:00:03.128913",
|
||||
"generated_at": "2026-04-22T12:00:04.136998",
|
||||
"agent_version": "V69_enhanced",
|
||||
"pages_scanned": 9,
|
||||
"fixed_elements_checked": 21,
|
||||
"issues_count": 6,
|
||||
"fixed_elements_checked": 23,
|
||||
"issues_count": 5,
|
||||
"status": "CRITICAL",
|
||||
"doctrine_61": "bottom-right reserved for chat WEVIA only",
|
||||
"issues": [
|
||||
{
|
||||
"page": "weval-technology-platform.html",
|
||||
"element": "opus-orphans-count-text",
|
||||
"type": "inline",
|
||||
"corner": "bottom-right",
|
||||
"z": 9997,
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"page": "wevia-widget.html",
|
||||
"element": "#opus-pattern-badge",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T04:00:05+00:00",
|
||||
"compute_ms": 3689,
|
||||
"timestamp": "2026-04-22T10:00:07+00:00",
|
||||
"compute_ms": 5100,
|
||||
"metrics": {
|
||||
"agents": 0,
|
||||
"agents_hierarchy": 0,
|
||||
@@ -13,31 +13,31 @@
|
||||
"oss_tools": 765,
|
||||
"oss_skills": 734,
|
||||
"oss_tests": 765,
|
||||
"docker": 19,
|
||||
"docker": 20,
|
||||
"ollama_models": 7,
|
||||
"git_repos": 38,
|
||||
"providers": [
|
||||
{
|
||||
"name": "Cerebras",
|
||||
"latency_ms": 949,
|
||||
"latency_ms": 1583,
|
||||
"status": "up"
|
||||
},
|
||||
{
|
||||
"name": "Groq",
|
||||
"latency_ms": 1106,
|
||||
"latency_ms": 907,
|
||||
"status": "up"
|
||||
}
|
||||
]
|
||||
},
|
||||
"scores": {
|
||||
"combined": 75,
|
||||
"infra": 56,
|
||||
"infra": 57,
|
||||
"ecosystem": 100,
|
||||
"agents": 0,
|
||||
"skills": 100,
|
||||
"nonreg": 100,
|
||||
"oss": 100,
|
||||
"docker": 95,
|
||||
"docker": 100,
|
||||
"providers": 72,
|
||||
"hierarchy": 0,
|
||||
"instructions": 100
|
||||
@@ -45,7 +45,7 @@
|
||||
"leaderboard": [
|
||||
{
|
||||
"name": "WEVAL_Ecosystem",
|
||||
"score": 80.6,
|
||||
"score": 80.7,
|
||||
"skills": 839,
|
||||
"agents": 0
|
||||
},
|
||||
@@ -61,7 +61,7 @@
|
||||
},
|
||||
{
|
||||
"name": "WEVAL_MiroFish",
|
||||
"score": 95,
|
||||
"score": 100,
|
||||
"type": "sovereign"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -175,7 +175,7 @@ foreach ($plan as $i => $step) {
|
||||
$d = @json_decode($raw_r, true);
|
||||
if ($d) {
|
||||
$final_response = $d["response"] ?? $d["content"] ?? "";
|
||||
if (preg_match("#https?://\S+?\.(?:pdf|docx|pptx|xlsx|svg|py|jsx)#", $final_response, $um)) {
|
||||
if (preg_match("#https?://\S+?\.(?:pdf|docx|pptx|xlsx|svg|py|jsx|jpg|jpeg|png|webp|gif)#", $final_response, $um)) {
|
||||
$final_file_url = $um[0];
|
||||
}
|
||||
}
|
||||
@@ -199,6 +199,6 @@ sse("done", [
|
||||
"response" => $final_response,
|
||||
"file_url" => $final_file_url,
|
||||
"pattern" => $pattern,
|
||||
"provider" => "ambre-claude-stream-v1",
|
||||
"provider" => "wevia-stream-v1",
|
||||
"intent" => $pattern . "_streamed",
|
||||
]);
|
||||
|
||||
@@ -86,37 +86,56 @@ if (preg_match("/g[eéèê]n[eéèê]re?.*(sch[eéèê]ma|mermaid|diagramme|flow
|
||||
exit;
|
||||
}
|
||||
|
||||
// ========== HANDLER 4: Image SVG via LLM ==========
|
||||
if (preg_match("/g[eéèê]n[eéèê]re?\s+(?:une|un)?\s*image\s*(?:\b(?:decrivant|repr[eéèê]sentant|pour|sur|de)\b\s*)?:?\s*(.+)$/iu", $__ad_msg, $__im)) {
|
||||
// ========== HANDLER 4: Image via ambre-tool-image.php CASCADE (V177 image-gemini-cascade) ==========
|
||||
// V177: Replace LLM SVG by real image cascade (Gemini 3 Pro Image Preview primary, Qwen fallback, Pollinations last resort)
|
||||
if (preg_match("/g[e\xc3\xa9\xc3\xa8\xc3\xaa]n[e\xc3\xa9\xc3\xa8\xc3\xaa]re?\s+(?:une|un)?\s*image\s*(?:\b(?:decrivant|repr[e\xc3\xa9\xc3\xa8\xc3\xaa]sentant|pour|sur|de)\b\s*)?:?\s*(.+)$/iu", $__ad_msg, $__im)) {
|
||||
$__topic = trim($__im[1]);
|
||||
$__sys = "Tu es un generateur d\"images SVG. Reponds UNIQUEMENT avec du code SVG valide 400x300, pas de markdown, pas de backticks. Formes geometriques + couleurs. Commence par <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 300\">.";
|
||||
$__user = "SVG representant: $__topic";
|
||||
$__llm = @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"=>$__sys],["role"=>"user","content"=>$__user]
|
||||
],"max_tokens"=>700,"temperature"=>0.4]),"timeout"=>25]
|
||||
]));
|
||||
$__svg = @json_decode($__llm,true)["choices"][0]["message"]["content"] ?? "";
|
||||
$__svg = trim(preg_replace("/```(?:svg|xml)?\n?|```/","",$__svg));
|
||||
$__t0 = microtime(true);
|
||||
|
||||
if (strpos($__svg, "<svg") !== false) {
|
||||
// Save to /generated/
|
||||
$__ts = date("Ymd-His");
|
||||
$__rand = substr(md5(random_bytes(4)),0,6);
|
||||
$__safe = preg_replace("/[^a-zA-Z0-9\-_]/","-",substr($__topic,0,40));
|
||||
$__fname = "wevia-img-$__safe-$__ts-$__rand.svg";
|
||||
@file_put_contents("/var/www/html/generated/$__fname", $__svg);
|
||||
$__size = strlen($__svg);
|
||||
// Call ambre-tool-image.php directly (internal, loopback)
|
||||
$__img_ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\nHost: weval-consulting.com\r\n",
|
||||
"content" => json_encode(["prompt" => $__topic]),
|
||||
"timeout" => 75,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$__img_resp = @file_get_contents("http://127.0.0.1/api/ambre-tool-image.php", false, $__img_ctx);
|
||||
$__img_d = @json_decode($__img_resp, true);
|
||||
|
||||
if ($__img_d && !empty($__img_d["success"]) && !empty($__img_d["url"])) {
|
||||
$__url = $__img_d["url"];
|
||||
$__provider = $__img_d["provider"] ?? "WEVIA Image Engine";
|
||||
$__quality = $__img_d["quality"] ?? "standard";
|
||||
$__size_kb = $__img_d["size_kb"] ?? 0;
|
||||
$__elapsed = round((microtime(true) - $__t0) * 1000);
|
||||
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response"=>"🎨 **$__topic** (image SVG)\n\n🔗 Telecharger: https://weval-consulting.com/generated/$__fname\n📦 Taille: " . round($__size/1024,1) . "KB · engine: LLM+SVG\n\n" . chr(96) . chr(96) . chr(96) . "html\n$__svg\n" . chr(96) . chr(96) . chr(96),
|
||||
"executed"=>true,"provider"=>"ambre-doc-gen-v5","intent"=>"image_svg_real",
|
||||
"topic"=>$__topic, "url"=>"https://weval-consulting.com/generated/$__fname",
|
||||
], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
|
||||
"response" => "\xf0\x9f\x8e\xa8 **$__topic**\n\n\xf0\x9f\x94\x97 T\xc3\xa9l\xc3\xa9charger: $__url\n\xf0\x9f\x93\xa6 Taille: {$__size_kb}KB \xc2\xb7 \xe2\x9a\x99\xef\xb8\x8f {$__elapsed}ms \xc2\xb7 engine: $__provider ($__quality)",
|
||||
"executed" => true,
|
||||
"provider" => "ambre-doc-gen-v5",
|
||||
"intent" => "image_real_cascade",
|
||||
"topic" => $__topic,
|
||||
"url" => $__url,
|
||||
"quality" => $__quality,
|
||||
"image_provider" => $__provider,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
// If cascade failed, fall through (old LLM SVG code removed to force real images)
|
||||
// Return an informative error to widget rather than fake SVG
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode([
|
||||
"response" => "\xe2\x9a\xa0\xef\xb8\x8f G\xc3\xa9n\xc3\xa9ration d\"image temporairement indisponible pour: $__topic. Tous les providers (Gemini 3 Pro, Qwen-Image, Pollinations) ont \xc3\xa9chou\xc3\xa9. R\xc3\xa9essayez dans quelques instants.",
|
||||
"executed" => true,
|
||||
"provider" => "ambre-doc-gen-v5",
|
||||
"intent" => "image_cascade_failed",
|
||||
"topic" => $__topic,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ========== HANDLER 5: Code generation with file ==========
|
||||
|
||||
13
api/ambre-pw-tests/pdf_preview.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 900, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/generated/wevia-pdf-premium-20260422-093848-93ab87.html', { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(4000); // Wait for Chart.js
|
||||
|
||||
await page.screenshot({ path: '/tmp/v173-premium-pdf-preview.png', fullPage: true });
|
||||
console.log('OK');
|
||||
await browser.close();
|
||||
})();
|
||||
58
api/ambre-pw-tests/v170_accents.js
Normal file
@@ -0,0 +1,58 @@
|
||||
// V170 · Test accents preserved + screenshot
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1280, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Type in chat
|
||||
const input = await page.locator('#msgInput, input[placeholder*="question"]').first();
|
||||
await input.click({force: true});
|
||||
await input.fill("Genere un schema mermaid pour: wevia architecture souveraine avec clés chiffrées et décryptage");
|
||||
await page.waitForTimeout(400);
|
||||
await input.press('Enter');
|
||||
console.log('SENT mermaid request');
|
||||
|
||||
// Wait for SSE completion + SVG render
|
||||
const start = Date.now();
|
||||
let svgInfo = null;
|
||||
while (Date.now() - start < 70000) {
|
||||
svgInfo = await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll('[id^="wv-mermaid-"]');
|
||||
if (svgs.length === 0) return null;
|
||||
const last = svgs[svgs.length - 1];
|
||||
const svg = last.querySelector('svg') || last.querySelector('[id*="wv-mermaid"]');
|
||||
if (!svg || !svg.outerHTML || svg.outerHTML.length < 500) return null;
|
||||
// Extract all text content from SVG
|
||||
const texts = Array.from(svg.querySelectorAll('text, foreignObject span, .nodeLabel')).map(t => t.textContent.trim()).filter(t => t.length > 0);
|
||||
return {
|
||||
found: true,
|
||||
svg_size: svg.outerHTML.length,
|
||||
texts: texts,
|
||||
has_accents: /[àâéèêëîïôùûüÿç]/i.test(svg.outerHTML),
|
||||
has_accent_cles: /cl[ée]s/i.test(svg.outerHTML),
|
||||
};
|
||||
});
|
||||
if (svgInfo && svgInfo.found) {
|
||||
console.log('SVG RENDERED:', JSON.stringify(svgInfo, null, 2));
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
|
||||
// Scroll to the SVG and screenshot
|
||||
await page.evaluate(() => {
|
||||
const svg = document.querySelector('[id^="wv-mermaid-"]:last-of-type');
|
||||
if (svg) svg.scrollIntoView({behavior: 'instant', block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
await page.screenshot({ path: '/tmp/v170-mermaid-accents.png', fullPage: true });
|
||||
console.log('Screenshot saved to /tmp/v170-mermaid-accents.png');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
72
api/ambre-pw-tests/v172_all.js
Normal file
@@ -0,0 +1,72 @@
|
||||
// V172 · Test ALL generations on /wevia.html + screenshots
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1200} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
const results = {};
|
||||
|
||||
const scenarios = [
|
||||
{ label: 'PDF', prompt: 'Genere un PDF professionnel sur: SAP S4HANA', screenshot: 'v172-01-pdf.png' },
|
||||
{ label: 'Code', prompt: 'Ecris le code React pour un composant Counter avec bouton +/-', screenshot: 'v172-02-code-react.png' },
|
||||
{ label: 'Mermaid', prompt: 'Genere un schema mermaid pour: architecture souveraine wevia', screenshot: 'v172-03-mermaid.png' },
|
||||
{ label: 'Image', prompt: 'Genere une image decrivant: dashboard moderne bleu', screenshot: 'v172-04-image.png' },
|
||||
{ label: 'Traduire', prompt: 'Traduis en anglais: bonjour comment allez-vous', screenshot: 'v172-05-translate.png' },
|
||||
{ label: 'Calc', prompt: '234 multiplie par 567', screenshot: 'v172-06-calc.png' },
|
||||
];
|
||||
|
||||
for (const sc of scenarios) {
|
||||
console.log(`\n═══ TEST: ${sc.label} ═══`);
|
||||
try {
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 15000 });
|
||||
await page.waitForTimeout(1500);
|
||||
|
||||
const input = await page.locator('#msgInput, input[placeholder*="question"]').first();
|
||||
await input.click({force: true});
|
||||
await input.fill(sc.prompt);
|
||||
await page.waitForTimeout(300);
|
||||
await input.press('Enter');
|
||||
console.log(`SENT: ${sc.prompt.substring(0,50)}`);
|
||||
|
||||
// Wait for completion (provider badge or final result)
|
||||
const start = Date.now();
|
||||
let done = false;
|
||||
while (Date.now() - start < 40000) {
|
||||
const state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
hasProvider: /provider:\s*wevia-stream/i.test(document.body.innerHTML),
|
||||
hasFooter: !!document.querySelector('.ambre-stream-container span'),
|
||||
has5Steps: document.querySelectorAll('.ambre-phase').length >= 4,
|
||||
hasDownloadLink: !!document.querySelector('a[href*="/generated/"]'),
|
||||
hasSvg: !!document.querySelector('[id^="wv-mermaid-"] svg'),
|
||||
hasCodeBlock: !!document.querySelector('pre code'),
|
||||
hasImage: !!document.querySelector('img[src*="/generated/"]'),
|
||||
}));
|
||||
if (!state.busy && state.has5Steps) {
|
||||
done = true;
|
||||
Object.assign(state, { elapsed_s: ((Date.now()-start)/1000).toFixed(1) });
|
||||
results[sc.label] = state;
|
||||
console.log(`DONE ${sc.label}: ${JSON.stringify(state)}`);
|
||||
break;
|
||||
}
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
if (!done) console.log(`TIMEOUT ${sc.label}`);
|
||||
|
||||
// Screenshot
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: `/tmp/${sc.screenshot}`, fullPage: true });
|
||||
console.log(`Screenshot: /tmp/${sc.screenshot}`);
|
||||
} catch (e) {
|
||||
console.log(`ERROR ${sc.label}: ${e.message}`);
|
||||
results[sc.label] = { error: e.message };
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n═══ SUMMARY ═══');
|
||||
console.log(JSON.stringify(results, null, 2));
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
33
api/ambre-pw-tests/v172_mermaid_scroll.js
Normal file
@@ -0,0 +1,33 @@
|
||||
const { chromium } = require("playwright");
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ["--no-sandbox"] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
await page.goto("https://weval-consulting.com/wevia.html?cb=" + Date.now(), { waitUntil: "networkidle" });
|
||||
await page.waitForTimeout(2000);
|
||||
const input = await page.locator("#msgInput").first();
|
||||
await input.click({force:true});
|
||||
await input.fill("Genere un schema mermaid pour: authentification souveraine avec clés privées");
|
||||
await input.press("Enter");
|
||||
console.log("SENT");
|
||||
// Wait for SVG to appear
|
||||
let svgInfo = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
svgInfo = await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll("[id^=\"wv-mermaid-\"] svg");
|
||||
if (svgs.length === 0) return null;
|
||||
const last = svgs[svgs.length - 1];
|
||||
const texts = Array.from(last.querySelectorAll("text, foreignObject span, .nodeLabel")).map(t => t.textContent).filter(t=>t);
|
||||
return { svg_count: svgs.length, width: last.getBoundingClientRect().width, texts: texts.slice(0, 15), has_accents: /[àéèêëçô]/.test(last.outerHTML), svg_len: last.outerHTML.length };
|
||||
});
|
||||
if (svgInfo && svgInfo.svg_count > 0) break;
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
console.log("SVG INFO:", JSON.stringify(svgInfo, null, 2));
|
||||
// Scroll to SVG
|
||||
await page.evaluate(() => { const s = document.querySelector("[id^=\"wv-mermaid-\"] svg"); if (s) s.scrollIntoView({block:"center"}); });
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: "/tmp/v172-03b-mermaid-svg.png", fullPage: true });
|
||||
console.log("Screenshot saved");
|
||||
await browser.close();
|
||||
})();
|
||||
68
api/ambre-pw-tests/v173_upsell.js
Normal file
@@ -0,0 +1,68 @@
|
||||
const { chromium } = require('playwright');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere un PDF professionnel sur: SAP S4HANA ROI benefits');
|
||||
await input.press('Enter');
|
||||
console.log('PDF simple request sent');
|
||||
|
||||
// Wait for SSE done + upsell banner
|
||||
const start = Date.now();
|
||||
let state = null;
|
||||
while (Date.now() - start < 45000) {
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
has5Steps: document.querySelectorAll('.ambre-phase').length >= 4,
|
||||
hasPdfLink: !!document.querySelector('a[href*=".pdf"]'),
|
||||
hasUpsellBanner: !!document.querySelector('.v173-upsell'),
|
||||
hasUpsellBtn: !!document.getElementById('v173-generate'),
|
||||
}));
|
||||
if (!state.busy && state.hasUpsellBanner) break;
|
||||
await page.waitForTimeout(2000);
|
||||
}
|
||||
console.log('After PDF simple:', JSON.stringify(state));
|
||||
|
||||
// Screenshot showing the upsell banner
|
||||
await page.evaluate(() => {
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173-upsell-banner.png', fullPage: true });
|
||||
console.log('Screenshot 1 (upsell): saved');
|
||||
|
||||
// Click the upsell button
|
||||
if (state.hasUpsellBtn) {
|
||||
await page.click('#v173-generate');
|
||||
console.log('Clicked upsell');
|
||||
// Wait for enrichi PDF generation
|
||||
const start2 = Date.now();
|
||||
let state2 = null;
|
||||
while (Date.now() - start2 < 60000) {
|
||||
state2 = await page.evaluate(() => {
|
||||
const banner = document.querySelector('.v173-upsell');
|
||||
return {
|
||||
bannerText: banner?.textContent.substring(0, 100),
|
||||
hasEnrichedLink: !!document.querySelector('.v173-upsell a[href*=".pdf"]'),
|
||||
enrichedUrl: document.querySelector('.v173-upsell a[href*=".pdf"]')?.href,
|
||||
};
|
||||
});
|
||||
if (state2.hasEnrichedLink) break;
|
||||
await page.waitForTimeout(2500);
|
||||
}
|
||||
console.log('After enrichi click:', JSON.stringify(state2));
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173-upsell-enriched.png', fullPage: true });
|
||||
console.log('Screenshot 2 (enriched): saved');
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
42
api/ambre-pw-tests/v173_v2.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere un PDF professionnel sur: SAP S4HANA ROI');
|
||||
await page.waitForTimeout(500);
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
// Patient wait · 60s max
|
||||
for (let i=0; i<30; i++) {
|
||||
await page.waitForTimeout(2000);
|
||||
const hasBanner = await page.evaluate(() => !!document.querySelector('.v173-upsell'));
|
||||
const hasBtn = await page.evaluate(() => !!document.getElementById('v173-generate'));
|
||||
if (hasBanner && hasBtn) {
|
||||
console.log(`Banner appeared after ${i*2}s`);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll to banner
|
||||
await page.evaluate(() => {
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1000);
|
||||
await page.screenshot({ path: '/tmp/v173b-banner-visible.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
// Show banner text
|
||||
const bannerText = await page.evaluate(() => document.querySelector('.v173-upsell')?.textContent.substring(0, 200));
|
||||
console.log('Banner:', bannerText);
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
65
api/ambre-pw-tests/v173_v3.js
Normal file
@@ -0,0 +1,65 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1400} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
// Capture console + errors
|
||||
page.on('console', msg => console.log('BROWSER:', msg.text().substring(0, 120)));
|
||||
page.on('pageerror', err => console.log('PAGE ERROR:', err.message));
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// Check input exists
|
||||
const inputExists = await page.evaluate(() => {
|
||||
const i = document.getElementById('msgInput');
|
||||
return { exists: !!i, tagName: i?.tagName, placeholder: i?.placeholder };
|
||||
});
|
||||
console.log('Input:', JSON.stringify(inputExists));
|
||||
|
||||
// Fill + dispatch via JS directly
|
||||
await page.evaluate(() => {
|
||||
const i = document.getElementById('msgInput');
|
||||
if (i) {
|
||||
i.value = 'Genere un PDF professionnel sur: SAP S4HANA ROI';
|
||||
i.focus();
|
||||
// Try sendMessage() or the form submit
|
||||
const sb = document.getElementById('sendBtn');
|
||||
if (sb && !sb.disabled) sb.click();
|
||||
}
|
||||
});
|
||||
console.log('Fill + click done');
|
||||
|
||||
// Wait patiently 70s checking state each 3s
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
const state = await page.evaluate(() => ({
|
||||
phase_count: document.querySelectorAll('.ambre-phase').length,
|
||||
messages_count: document.querySelectorAll('#messages > *').length,
|
||||
has_banner: !!document.querySelector('.v173-upsell'),
|
||||
busy: document.getElementById('sendBtn')?.disabled,
|
||||
}));
|
||||
console.log(`t+${i*3+3}s:`, JSON.stringify(state));
|
||||
if (state.has_banner) { console.log('BANNER VISIBLE!'); break; }
|
||||
}
|
||||
|
||||
// Final screenshot with scroll
|
||||
await page.evaluate(() => {
|
||||
const msgs = document.getElementById('messages');
|
||||
if (msgs) msgs.scrollTop = msgs.scrollHeight;
|
||||
const b = document.querySelector('.v173-upsell');
|
||||
if (b) b.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v173c-final.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
const finalInfo = await page.evaluate(() => ({
|
||||
bannerHTML: document.querySelector('.v173-upsell')?.outerHTML?.substring(0, 500),
|
||||
phaseCount: document.querySelectorAll('.ambre-phase').length,
|
||||
}));
|
||||
console.log('FINAL:', JSON.stringify(finalInfo));
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
40
api/ambre-pw-tests/v175_img.js
Normal file
@@ -0,0 +1,40 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo WEVIA bleu moderne');
|
||||
await input.press('Enter');
|
||||
console.log('SENT image request');
|
||||
|
||||
let state = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(2500);
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasSvgRendered: document.querySelectorAll('svg[xmlns*="w3.org"]').length > 0,
|
||||
hasImgTag: document.querySelectorAll('img[src*="generated"]').length > 0,
|
||||
hasCodeSvg: /```.*<svg/.test(document.body.innerText),
|
||||
}));
|
||||
if (!state.busy && state.phases >= 4 && (state.hasSvgRendered || state.hasImgTag)) break;
|
||||
}
|
||||
console.log('State:', JSON.stringify(state));
|
||||
|
||||
// Scroll to the generated SVG
|
||||
await page.evaluate(() => {
|
||||
const svgs = document.querySelectorAll('svg[xmlns*="w3.org"]');
|
||||
if (svgs.length > 0) svgs[svgs.length-1].scrollIntoView({block:'center'});
|
||||
});
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: '/tmp/v175-image-rendered.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
40
api/ambre-pw-tests/v178.js
Normal file
@@ -0,0 +1,40 @@
|
||||
const { chromium } = require('playwright');
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: {width: 1440, height: 1800} });
|
||||
const page = await ctx.newPage();
|
||||
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle' });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: logo bleu WEVIA minimalist moderne');
|
||||
await input.press('Enter');
|
||||
console.log('SENT');
|
||||
|
||||
let state = null;
|
||||
for (let i=0; i<25; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
state = await page.evaluate(() => ({
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
phases: document.querySelectorAll('.ambre-phase').length,
|
||||
hasImgTag: document.querySelectorAll('img[src*="generated"]').length,
|
||||
imgSrc: document.querySelector('img[src*="generated"]')?.src,
|
||||
imgWidth: document.querySelector('img[src*="generated"]')?.naturalWidth || 0,
|
||||
}));
|
||||
console.log(`t+${i*3+3}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.hasImgTag > 0 && state.imgWidth > 100) break;
|
||||
}
|
||||
|
||||
// Scroll to image
|
||||
await page.evaluate(() => {
|
||||
const img = document.querySelector('img[src*="generated"]');
|
||||
if (img) img.scrollIntoView({block:'center'});
|
||||
});
|
||||
await page.waitForTimeout(2000);
|
||||
await page.screenshot({ path: '/tmp/v178-image-rendered.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await browser.close();
|
||||
})();
|
||||
80
api/ambre-pw-tests/v178_video.js
Normal file
@@ -0,0 +1,80 @@
|
||||
// V178 · Video test image generation on /wevia.html
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
const ctx = await browser.newContext({
|
||||
ignoreHTTPSErrors: true,
|
||||
viewport: {width: 1440, height: 900},
|
||||
recordVideo: { dir: '/tmp/v178-video/', size: {width: 1440, height: 900} }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
console.log('1. Go to /wevia.html');
|
||||
await page.goto('https://weval-consulting.com/wevia.html?cb=' + Date.now(), { waitUntil: 'networkidle', timeout: 20000 });
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
console.log('2. Type the image request');
|
||||
const input = await page.locator('#msgInput').first();
|
||||
await input.click({force: true});
|
||||
await input.fill('Genere une image decrivant: WEVIA LOGO premium blue');
|
||||
await page.waitForTimeout(800);
|
||||
await input.press('Enter');
|
||||
console.log('3. Request sent · waiting for generation');
|
||||
|
||||
// Wait for download link + inline image
|
||||
let state = null;
|
||||
for (let i=0; i<20; i++) {
|
||||
await page.waitForTimeout(3000);
|
||||
state = await page.evaluate(() => {
|
||||
const links = document.querySelectorAll('a[href*="/generated/"]');
|
||||
const imgs = document.querySelectorAll('img[src*="/generated/"]');
|
||||
const phases = document.querySelectorAll('.ambre-phase').length;
|
||||
return {
|
||||
phases,
|
||||
downloadLinks: links.length,
|
||||
firstLinkHref: links.length > 0 ? links[0].href : null,
|
||||
inlineImages: imgs.length,
|
||||
firstImgSrc: imgs.length > 0 ? imgs[0].src : null,
|
||||
firstImgLoaded: imgs.length > 0 ? imgs[0].complete && imgs[0].naturalHeight > 0 : false,
|
||||
busy: !!document.getElementById('sendBtn')?.disabled,
|
||||
};
|
||||
});
|
||||
console.log(`t+${(i+1)*3}s:`, JSON.stringify(state));
|
||||
if (!state.busy && state.phases >= 4 && state.downloadLinks > 0) break;
|
||||
}
|
||||
|
||||
// Scroll to result
|
||||
await page.evaluate(() => {
|
||||
const link = document.querySelector('a[href*="/generated/"]');
|
||||
if (link) link.scrollIntoView({block: 'center'});
|
||||
});
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
// Click the download link
|
||||
if (state.downloadLinks > 0) {
|
||||
console.log('4. Clicking download link:', state.firstLinkHref);
|
||||
const link = await page.locator('a[href*="/generated/"]').first();
|
||||
|
||||
// Hover first (to show cursor)
|
||||
await link.hover();
|
||||
await page.waitForTimeout(1500);
|
||||
}
|
||||
|
||||
// Final screenshot
|
||||
await page.screenshot({ path: '/tmp/v178-final.png', fullPage: true });
|
||||
console.log('Screenshot saved');
|
||||
|
||||
await ctx.close(); // Flushes video
|
||||
await browser.close();
|
||||
|
||||
// Rename video
|
||||
const videos = fs.readdirSync('/tmp/v178-video/');
|
||||
if (videos.length > 0) {
|
||||
const vpath = '/tmp/v178-video/' + videos[0];
|
||||
fs.renameSync(vpath, '/tmp/v178-image-test.webm');
|
||||
const stats = fs.statSync('/tmp/v178-image-test.webm');
|
||||
console.log(`Video saved: /tmp/v178-image-test.webm (${(stats.size/1024/1024).toFixed(1)} MB)`);
|
||||
}
|
||||
})();
|
||||
@@ -1,9 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* ambre-tool-image.php · Real image generation via Pollinations.ai (free, no auth)
|
||||
* Returns downloadable PNG from prompt
|
||||
* V176 · ambre-tool-image.php · Upgraded with quality cascade
|
||||
* Yacine: "IMAGE POURRI MET A LOUVER QWEN IMAGE POUR AMELOIRER"
|
||||
*
|
||||
* Cascade (order by QUALITY):
|
||||
* 1. Gemini 3 Pro Image Preview (best quality, free tier via GEMINI_KEY) - PRIMARY
|
||||
* 2. Qwen-Image via DashScope (requires ALIBABA_KEY with credits)
|
||||
* 3. Pollinations flux (free, 1024x1024)
|
||||
* 4. Pollinations sana (free, 768x768 fast fallback)
|
||||
*
|
||||
* Keep backward compat: same response schema as before
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
set_time_limit(90);
|
||||
|
||||
$raw = file_get_contents("php://input");
|
||||
$in = json_decode($raw, true) ?: $_POST ?: $_GET;
|
||||
@@ -11,45 +20,185 @@ $prompt = trim($in["prompt"] ?? $in["q"] ?? "");
|
||||
|
||||
if (!$prompt) { echo json_encode(["error"=>"prompt required"]); exit; }
|
||||
|
||||
// Clean + translate prompt (keep as-is - Pollinations handles multilingue)
|
||||
$clean = preg_replace('/[^\p{L}\p{N}\s,.\-]/u', '', $prompt);
|
||||
$clean = substr(trim($clean), 0, 300);
|
||||
// Clean prompt (keep unicode)
|
||||
$clean = preg_replace('/[^\p{L}\p{N}\s,.\-!?]/u', '', $prompt);
|
||||
$clean = mb_substr(trim($clean), 0, 400);
|
||||
|
||||
// Pollinations API
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
$pollinations_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true";
|
||||
|
||||
// Fetch image (with 30s timeout)
|
||||
$ctx = stream_context_create([
|
||||
"http" => ["timeout"=>30, "header"=>"User-Agent: WEVIA/1.0\r\n"],
|
||||
"https" => ["timeout"=>30, "header"=>"User-Agent: WEVIA/1.0\r\n"],
|
||||
]);
|
||||
$t0 = microtime(true);
|
||||
$img_data = @file_get_contents($pollinations_url, false, $ctx);
|
||||
$elapsed = round((microtime(true)-$t0)*1000);
|
||||
|
||||
if (!$img_data || strlen($img_data) < 1000) {
|
||||
echo json_encode(["error"=>"image generation failed", "prompt"=>$clean, "elapsed"=>$elapsed]);
|
||||
exit;
|
||||
// Load secrets
|
||||
$secrets = [];
|
||||
foreach (file("/etc/weval/secrets.env") ?: [] as $line) {
|
||||
$line = trim($line);
|
||||
if (!$line || $line[0] === "#" || strpos($line, "=") === false) continue;
|
||||
list($k, $v) = explode("=", $line, 2);
|
||||
$secrets[trim($k)] = trim($v, " \"'");
|
||||
}
|
||||
$GEMINI_KEY = $secrets["GEMINI_KEY"] ?? "";
|
||||
$ALIBABA_KEY = $secrets["ALIBABA_KEY"] ?? "";
|
||||
|
||||
// Save to /generated/
|
||||
// File naming (shared across cascade)
|
||||
$dir = "/var/www/html/generated";
|
||||
if (!is_dir($dir)) @mkdir($dir, 0755, true);
|
||||
$slug = preg_replace('/[^a-z0-9]+/', '-', strtolower($clean));
|
||||
$slug = substr(trim($slug, "-"), 0, 50);
|
||||
$ts = date("Ymd-His");
|
||||
$rand = bin2hex(random_bytes(3));
|
||||
$filename = "wevia-img-{$slug}-{$ts}-{$rand}.png";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img_data);
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img_data)/1024, 1),
|
||||
"elapsed_ms" => $elapsed,
|
||||
"provider" => "WEVIA Image Engine",
|
||||
]);
|
||||
$t0 = microtime(true);
|
||||
$result = null;
|
||||
|
||||
// ========== TIER 1: Gemini 3 Pro Image Preview (best quality, free) ==========
|
||||
if ($GEMINI_KEY) {
|
||||
$gurl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent?key=" . $GEMINI_KEY;
|
||||
$body = json_encode([
|
||||
"contents" => [["parts" => [["text" => $clean]]]],
|
||||
"generationConfig" => ["responseModalities" => ["IMAGE", "TEXT"]],
|
||||
]);
|
||||
$ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Content-Type: application/json\r\n",
|
||||
"content" => $body,
|
||||
"timeout" => 60,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$resp = @file_get_contents($gurl, false, $ctx);
|
||||
if ($resp) {
|
||||
$d = @json_decode($resp, true);
|
||||
if (isset($d["candidates"][0]["content"]["parts"])) {
|
||||
foreach ($d["candidates"][0]["content"]["parts"] as $p) {
|
||||
if (isset($p["inlineData"]["data"])) {
|
||||
$mime = $p["inlineData"]["mimeType"] ?? "image/jpeg";
|
||||
$ext = strpos($mime, "png") !== false ? "png" : "jpg";
|
||||
$filename = "wevia-img-gemini-{$slug}-{$ts}-{$rand}.{$ext}";
|
||||
$path = "$dir/$filename";
|
||||
$img = base64_decode($p["inlineData"]["data"]);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "Gemini 3 Pro Image Preview",
|
||||
"quality" => "premium",
|
||||
"engine" => "gemini-3-pro",
|
||||
];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 2: Qwen-Image via DashScope (if Gemini failed + ALIBABA_KEY) ==========
|
||||
if (!$result && $ALIBABA_KEY) {
|
||||
// Create async task
|
||||
$submit_ctx = stream_context_create([
|
||||
"http" => [
|
||||
"method" => "POST",
|
||||
"header" => "Authorization: Bearer $ALIBABA_KEY\r\nContent-Type: application/json\r\nX-DashScope-Async: enable\r\n",
|
||||
"content" => json_encode([
|
||||
"model" => "qwen-image",
|
||||
"input" => ["prompt" => $clean],
|
||||
"parameters" => ["size" => "1024*1024", "n" => 1],
|
||||
]),
|
||||
"timeout" => 15,
|
||||
"ignore_errors" => true,
|
||||
],
|
||||
]);
|
||||
$submit_resp = @file_get_contents("https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis", false, $submit_ctx);
|
||||
$submit_d = @json_decode($submit_resp, true);
|
||||
$task_id = $submit_d["output"]["task_id"] ?? "";
|
||||
if ($task_id) {
|
||||
// Poll
|
||||
for ($i = 0; $i < 20; $i++) {
|
||||
sleep(2);
|
||||
$pctx = stream_context_create(["http"=>["header"=>"Authorization: Bearer $ALIBABA_KEY\r\n","timeout"=>10]]);
|
||||
$pr = @file_get_contents("https://dashscope-intl.aliyuncs.com/api/v1/tasks/$task_id", false, $pctx);
|
||||
$pd = @json_decode($pr, true);
|
||||
$status = $pd["output"]["task_status"] ?? "";
|
||||
if ($status === "SUCCEEDED") {
|
||||
$img_url = $pd["output"]["results"][0]["url"] ?? "";
|
||||
if ($img_url) {
|
||||
$img = @file_get_contents($img_url);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-qwen-{$slug}-{$ts}-{$rand}.png";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "Qwen-Image (Alibaba DashScope)",
|
||||
"quality" => "premium",
|
||||
"engine" => "qwen-image",
|
||||
];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ($status === "FAILED" || $status === "UNKNOWN") break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 3: Pollinations flux (free 1024x1024) ==========
|
||||
if (!$result) {
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
// Try with flux model hint (even though list shows only sana, try anyway)
|
||||
$flux_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true&model=flux";
|
||||
$ctx2 = stream_context_create(["http"=>["timeout"=>30,"header"=>"User-Agent: WEVIA/2.0\r\n"]]);
|
||||
$img = @file_get_contents($flux_url, false, $ctx2);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-flux-{$slug}-{$ts}-{$rand}.jpg";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "Pollinations flux (fallback)",
|
||||
"quality" => "standard",
|
||||
"engine" => "pollinations-flux",
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// ========== TIER 4: Pollinations sana (last resort) ==========
|
||||
if (!$result) {
|
||||
$seed = rand(1, 99999);
|
||||
$encoded = urlencode($clean);
|
||||
$sana_url = "https://image.pollinations.ai/prompt/$encoded?width=1024&height=1024&seed=$seed&nologo=true&enhance=true";
|
||||
$ctx3 = stream_context_create(["http"=>["timeout"=>30,"header"=>"User-Agent: WEVIA/2.0\r\n"]]);
|
||||
$img = @file_get_contents($sana_url, false, $ctx3);
|
||||
if ($img && strlen($img) > 5000) {
|
||||
$filename = "wevia-img-sana-{$slug}-{$ts}-{$rand}.jpg";
|
||||
$path = "$dir/$filename";
|
||||
file_put_contents($path, $img);
|
||||
$result = [
|
||||
"success" => true,
|
||||
"prompt" => $clean,
|
||||
"url" => "https://weval-consulting.com/generated/$filename",
|
||||
"size_kb" => round(strlen($img)/1024, 1),
|
||||
"elapsed_ms" => round((microtime(true)-$t0)*1000),
|
||||
"provider" => "WEVIA Image Engine (sana)",
|
||||
"quality" => "basic",
|
||||
"engine" => "pollinations-sana",
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
echo json_encode(["error"=>"all image providers failed","prompt"=>$clean]);
|
||||
exit;
|
||||
}
|
||||
|
||||
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
184
api/ambre-xlsx-gen.php
Normal file
@@ -0,0 +1,184 @@
|
||||
<?php
|
||||
/**
|
||||
* V174 · ambre-xlsx-gen.php
|
||||
* Real XLSX generation using Python openpyxl via shell_exec
|
||||
* Yacine: Excel KO · genere docx au lieu xlsx
|
||||
* Cause: ambre-xlsx-gen.php missing, fallback to docx
|
||||
* Fix: this file generates real xlsx via openpyxl (already installed)
|
||||
*/
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
set_time_limit(60);
|
||||
$t0 = microtime(true);
|
||||
|
||||
$topic = trim($_GET["topic"] ?? $_POST["topic"] ?? "");
|
||||
if (!$topic) {
|
||||
echo json_encode(["error"=>"topic required"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 1. Use LLM to generate JSON structure for the spreadsheet
|
||||
$sys = "Tu es generateur de donnees spreadsheet. Reponds UNIQUEMENT avec JSON valide, pas de markdown. Schema: {\"sheet_name\":\"...\",\"headers\":[\"col1\",\"col2\",...],\"rows\":[[\"val1\",\"val2\",...],...],\"kpis\":{\"metric\":\"value\",...}}. MAX 8 columns, 15 rows. Donnees realistes en francais avec chiffres et pourcentages.";
|
||||
$user = "Genere donnees spreadsheet pour: $topic";
|
||||
$llm_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"=>$sys],
|
||||
["role"=>"user","content"=>$user],
|
||||
],
|
||||
"max_tokens" => 1200,
|
||||
"temperature" => 0.3,
|
||||
]),
|
||||
"timeout" => 30,
|
||||
],
|
||||
]));
|
||||
$llm_d = @json_decode($llm_raw, true);
|
||||
$content = $llm_d["choices"][0]["message"]["content"] ?? "";
|
||||
$content = trim(preg_replace("/```(?:json)?\n?|```/", "", $content));
|
||||
|
||||
// Parse JSON
|
||||
$data = @json_decode($content, true);
|
||||
if (!$data || !isset($data["headers"]) || !isset($data["rows"])) {
|
||||
// Fallback minimal
|
||||
$data = [
|
||||
"sheet_name" => mb_substr($topic, 0, 30),
|
||||
"headers" => ["Categorie", "Valeur", "Pourcentage"],
|
||||
"rows" => [
|
||||
["Donnee 1", 100, "25%"],
|
||||
["Donnee 2", 200, "50%"],
|
||||
["Donnee 3", 300, "75%"],
|
||||
],
|
||||
"kpis" => ["Total"=>"600","Moyenne"=>"200"],
|
||||
];
|
||||
}
|
||||
|
||||
// 2. Call Python script to generate xlsx
|
||||
$slug = preg_replace("/[^a-z0-9-]/", "-", strtolower($topic));
|
||||
$slug = trim(preg_replace("/-+/", "-", $slug), "-");
|
||||
$slug = mb_substr($slug, 0, 40);
|
||||
$filename = "wevia-xlsx-" . $slug . "-" . date("Ymd-His") . "-" . substr(md5($topic.rand()), 0, 6) . ".xlsx";
|
||||
$filepath = "/var/www/html/generated/" . $filename;
|
||||
|
||||
// JSON data file for Python to read (avoid shell escaping issues)
|
||||
$json_tmp = "/tmp/wevia-xlsx-" . uniqid() . ".json";
|
||||
file_put_contents($json_tmp, json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
$py_script = <<<'PYEND'
|
||||
import json, sys, openpyxl
|
||||
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
||||
from openpyxl.chart import BarChart, Reference
|
||||
json_file = sys.argv[1]
|
||||
xlsx_out = sys.argv[2]
|
||||
topic = sys.argv[3]
|
||||
with open(json_file) as f:
|
||||
data = json.load(f)
|
||||
wb = openpyxl.Workbook()
|
||||
ws = wb.active
|
||||
ws.title = (data.get("sheet_name") or topic[:30])[:30]
|
||||
# Header styling
|
||||
header_font = Font(bold=True, color="FFFFFF", size=12)
|
||||
header_fill = PatternFill(start_color="6366F1", end_color="6366F1", fill_type="solid")
|
||||
header_align = Alignment(horizontal="center", vertical="center")
|
||||
# Title row
|
||||
ws["A1"] = topic
|
||||
ws["A1"].font = Font(bold=True, size=16, color="4338CA")
|
||||
ws["A1"].alignment = Alignment(horizontal="left", vertical="center")
|
||||
ws.row_dimensions[1].height = 30
|
||||
# Headers row 3
|
||||
headers = data.get("headers", [])
|
||||
for i, h in enumerate(headers):
|
||||
cell = ws.cell(row=3, column=i+1, value=h)
|
||||
cell.font = header_font
|
||||
cell.fill = header_fill
|
||||
cell.alignment = header_align
|
||||
# Data rows
|
||||
rows = data.get("rows", [])
|
||||
for ri, row in enumerate(rows):
|
||||
for ci, val in enumerate(row):
|
||||
c = ws.cell(row=4+ri, column=ci+1, value=val)
|
||||
c.alignment = Alignment(vertical="center")
|
||||
if ri % 2 == 0:
|
||||
c.fill = PatternFill(start_color="F1F5F9", end_color="F1F5F9", fill_type="solid")
|
||||
# Column widths
|
||||
for i, h in enumerate(headers):
|
||||
ws.column_dimensions[chr(65+i)].width = max(15, len(str(h))+5)
|
||||
# KPIs section
|
||||
kpi_row = 4 + len(rows) + 2
|
||||
kpis = data.get("kpis", {})
|
||||
if kpis:
|
||||
kpi_cell = ws.cell(row=kpi_row, column=1, value="KPIs")
|
||||
kpi_cell.font = Font(bold=True, size=14, color="4338CA")
|
||||
for i, (k, v) in enumerate(kpis.items()):
|
||||
ws.cell(row=kpi_row+1+i, column=1, value=k).font = Font(bold=True)
|
||||
ws.cell(row=kpi_row+1+i, column=2, value=v)
|
||||
# Add chart if numeric data
|
||||
try:
|
||||
numeric_col = None
|
||||
for ci, h in enumerate(headers):
|
||||
if any(isinstance(r[ci], (int, float)) if ci < len(r) else False for r in rows):
|
||||
numeric_col = ci
|
||||
break
|
||||
if numeric_col is not None and len(rows) > 0:
|
||||
chart = BarChart()
|
||||
chart.title = "Visualisation"
|
||||
chart.style = 13
|
||||
data_ref = Reference(ws, min_col=numeric_col+1, min_row=3, max_row=3+len(rows), max_col=numeric_col+1)
|
||||
cats_ref = Reference(ws, min_col=1, min_row=4, max_row=3+len(rows))
|
||||
chart.add_data(data_ref, titles_from_data=True)
|
||||
chart.set_categories(cats_ref)
|
||||
chart.width = 15
|
||||
chart.height = 8
|
||||
ws.add_chart(chart, f"E{kpi_row}")
|
||||
except Exception as e:
|
||||
print(f"Chart error: {e}", file=sys.stderr)
|
||||
wb.save(xlsx_out)
|
||||
print("OK")
|
||||
PYEND;
|
||||
|
||||
$py_tmp = "/tmp/wevia-xlsx-gen-" . uniqid() . ".py";
|
||||
file_put_contents($py_tmp, $py_script);
|
||||
|
||||
$cmd = "python3 " . escapeshellarg($py_tmp) . " " . escapeshellarg($json_tmp) . " " . escapeshellarg($filepath) . " " . escapeshellarg($topic) . " 2>&1";
|
||||
$out = shell_exec($cmd);
|
||||
@unlink($py_tmp);
|
||||
@unlink($json_tmp);
|
||||
|
||||
if (!file_exists($filepath) || filesize($filepath) < 100) {
|
||||
echo json_encode(["error"=>"xlsx generation failed","python_out"=>$out]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$size = filesize($filepath);
|
||||
$elapsed = round((microtime(true) - $t0) * 1000);
|
||||
$full_url = "https://weval-consulting.com/generated/" . $filename;
|
||||
|
||||
// Build preview text
|
||||
$preview = "📊 **" . $topic . "** (Excel reel avec graphique)\n\n";
|
||||
$preview .= "Feuille: " . ($data["sheet_name"] ?? $topic) . "\n";
|
||||
$preview .= "Colonnes: " . count($data["headers"] ?? []) . " · Lignes: " . count($data["rows"] ?? []) . "\n";
|
||||
if (!empty($data["kpis"])) {
|
||||
$preview .= "\nKPIs:\n";
|
||||
foreach ($data["kpis"] as $k => $v) {
|
||||
$preview .= "- **$k**: $v\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"ok" => true,
|
||||
"url" => "/generated/" . $filename,
|
||||
"full_url" => $full_url,
|
||||
"size_bytes" => $size,
|
||||
"size_human" => round($size/1024, 1) . "KB",
|
||||
"elapsed_ms" => $elapsed,
|
||||
"engine" => "openpyxl",
|
||||
"provider" => "WEVIA XLSX Engine V174",
|
||||
"topic" => $topic,
|
||||
"preview" => $preview,
|
||||
"sheet_name" => $data["sheet_name"] ?? $topic,
|
||||
"rows_count" => count($data["rows"] ?? []),
|
||||
"columns_count" => count($data["headers"] ?? []),
|
||||
"has_chart" => true,
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-04-22 09:00:02",
|
||||
"generated": "2026-04-22 14:30:01",
|
||||
"version": "1.0",
|
||||
"servers": [
|
||||
{
|
||||
@@ -8,9 +8,9 @@
|
||||
"private": "10.1.0.2",
|
||||
"role": "PRIMARY",
|
||||
"ssh": 49222,
|
||||
"disk_pct": 86,
|
||||
"disk_avail": "22G",
|
||||
"uptime": "up 1 week, 23 hours, 8 minutes",
|
||||
"disk_pct": 87,
|
||||
"disk_avail": "20G",
|
||||
"uptime": "up 1 week, 1 day, 4 hours, 38 minutes",
|
||||
"nginx": "active",
|
||||
"php_fpm": "active",
|
||||
"php_version": "8.5.5"
|
||||
@@ -41,7 +41,7 @@
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -51,17 +51,17 @@
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 4 days",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -81,7 +81,7 @@
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 5 days",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -96,27 +96,27 @@
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
@@ -126,12 +126,12 @@
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 7 days (healthy)",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 7 days",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
@@ -292,7 +292,7 @@
|
||||
"screens": {
|
||||
"s204_html": 328,
|
||||
"s204_products": 104,
|
||||
"s204_api_php": 1067,
|
||||
"s204_api_php": 1075,
|
||||
"s204_wevia_php": 254,
|
||||
"s95_arsenal_html": 1377,
|
||||
"s95_arsenal_api": 377
|
||||
@@ -316,7 +316,7 @@
|
||||
"langfuse"
|
||||
],
|
||||
"key_tables": {
|
||||
"kb_learnings": 5706,
|
||||
"kb_learnings": 5783,
|
||||
"kb_documents": 0,
|
||||
"ethica_medecins": 50004,
|
||||
"enterprise_agents": 0
|
||||
@@ -616,15 +616,15 @@
|
||||
]
|
||||
},
|
||||
"wiki": {
|
||||
"total_entries": 5706,
|
||||
"total_entries": 5783,
|
||||
"categories": [
|
||||
{
|
||||
"category": "AUTO-FIX",
|
||||
"cnt": "3096"
|
||||
"cnt": "3162"
|
||||
},
|
||||
{
|
||||
"category": "TOPOLOGY",
|
||||
"cnt": "1254"
|
||||
"cnt": "1265"
|
||||
},
|
||||
{
|
||||
"category": "DISCOVERY",
|
||||
@@ -1724,54 +1724,54 @@
|
||||
"fast_lines": 3718,
|
||||
"router_lines": 6152,
|
||||
"router_functions": 17,
|
||||
"today_requests": 0,
|
||||
"today_requests": 2,
|
||||
"today_cost": 0,
|
||||
"avg_latency_ms": 0,
|
||||
"top_provider": "N\/A",
|
||||
"providers_used": 0
|
||||
"avg_latency_ms": 8754,
|
||||
"top_provider": "nvidia",
|
||||
"providers_used": 1
|
||||
},
|
||||
"optimizations": {
|
||||
"recent_commits": [],
|
||||
"auto_fixes": [
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:55: 2 fixes. Disk light cleanup 86%; Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 10:55:14.715277"
|
||||
"fact": "AUTONOMY 22Apr 14:25: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:25:05.235042"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:50: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:50:05.966888"
|
||||
"fact": "AUTONOMY 22Apr 14:20: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:20:05.919944"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:45: 2 fixes. Disk light cleanup 86%; Docker restart weval-docuseal",
|
||||
"created_at": "2026-04-22 10:45:05.414088"
|
||||
"fact": "AUTONOMY 22Apr 14:15: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:15:05.864979"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:40: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:40:05.253699"
|
||||
"fact": "AUTONOMY 22Apr 14:10: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:10:07.401151"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:35: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:35:04.63423"
|
||||
"fact": "AUTONOMY 22Apr 14:05: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:05:07.600978"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:30: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:30:08.326062"
|
||||
"fact": "AUTONOMY 22Apr 14:00: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 16:00:12.323948"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:25: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:25:05.043155"
|
||||
"fact": "AUTONOMY 22Apr 13:55: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:55:05.005626"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:20: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:20:05.6286"
|
||||
"fact": "AUTONOMY 22Apr 13:50: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:50:07.271045"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:15: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:15:06.533813"
|
||||
"fact": "AUTONOMY 22Apr 13:45: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:45:05.958828"
|
||||
},
|
||||
{
|
||||
"fact": "AUTONOMY 22Apr 08:10: 1 fixes. Disk light cleanup 86%",
|
||||
"created_at": "2026-04-22 10:10:06.375058"
|
||||
"fact": "AUTONOMY 22Apr 13:40: 1 fixes. Disk light cleanup 87%",
|
||||
"created_at": "2026-04-22 15:40:05.878559"
|
||||
}
|
||||
],
|
||||
"architecture_decisions": [
|
||||
@@ -1960,7 +1960,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"scan_time_ms": 2526,
|
||||
"scan_time_ms": 3661,
|
||||
"gaps": [],
|
||||
"score": 100,
|
||||
"automation": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-04-22T11:10:02.122058",
|
||||
"generated_at": "2026-04-22T16:55:01.645797",
|
||||
"stats": {
|
||||
"total": 50,
|
||||
"pending": 32,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"status": "ALIVE",
|
||||
"ts": "2026-04-22T11:00:02.013919",
|
||||
"last_heartbeat": "2026-04-22T11:00:02.013919",
|
||||
"last_heartbeat_ts_epoch": 1776848402,
|
||||
"ts": "2026-04-22T16:45:01.276654",
|
||||
"last_heartbeat": "2026-04-22T16:45:01.276654",
|
||||
"last_heartbeat_ts_epoch": 1776869101,
|
||||
"tasks_today": 232,
|
||||
"tasks_week": 574,
|
||||
"agent_id": "blade-ops",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# WEVIA Master — System Documentation
|
||||
Generated: Wed Apr 22 12:00:01 AM CEST 2026
|
||||
Generated: Wed Apr 22 12:00:02 PM CEST 2026
|
||||
|
||||
## APIs (252)
|
||||
## APIs (254)
|
||||
wevia-action-engine.php
|
||||
wevia-actions.php
|
||||
wevia-admin-crm-bridge.php
|
||||
@@ -51,6 +51,7 @@ wevia-bvs-api.php
|
||||
wevia-capabilities-ext.php
|
||||
wevia-capabilities-faq-v81.php
|
||||
wevia-capabilities.php
|
||||
wevia-chat-memory.php
|
||||
wevia-chat.php
|
||||
wevia-chat-relay.php
|
||||
wevia-chat-test.php
|
||||
@@ -92,6 +93,7 @@ wevia-enterprise-fleet.php
|
||||
wevia-enterprise.php
|
||||
wevia-exec-intercept.php
|
||||
wevia-exec.php
|
||||
wevia-factory.php
|
||||
wevia-fast-path.php
|
||||
wevia-fast-path-v3.php
|
||||
wevia-fiability.php
|
||||
@@ -255,7 +257,7 @@ wevia-wave114-intents.php
|
||||
wevia-wave114.php
|
||||
wevia-webchat-direct.php
|
||||
|
||||
## Scripts (43)
|
||||
## Scripts (45)
|
||||
wevia-antiregression.py
|
||||
wevia-autodoc.sh
|
||||
wevia-autointent-sync.sh
|
||||
@@ -275,6 +277,7 @@ wevia-deepseek-web.py
|
||||
wevia-full-test.py
|
||||
wevia-gap-analyzer.py
|
||||
wevia-intel.sh
|
||||
wevia-intents-pool.sh
|
||||
wevia-l99-autofix.py
|
||||
wevia-llm-worker.py
|
||||
wevia-master-test.py
|
||||
@@ -286,6 +289,7 @@ wevia-register-agent.py
|
||||
wevia-renew-pat.py
|
||||
wevia-self-doc.sh
|
||||
wevia-selfmanage.sh
|
||||
wevia-self-meta.sh
|
||||
wevia-site-builder.php
|
||||
wevia-site-builder-v1-dark.php
|
||||
wevia-site-builder-v2-light-pre-em.php
|
||||
@@ -300,7 +304,7 @@ wevia-ux-agent.py
|
||||
wevia-webchat-api.py
|
||||
wevia-webwide.py
|
||||
|
||||
## Crons (85)
|
||||
## Crons (86)
|
||||
*/10 * * * * /usr/bin/python3 /opt/weval-l99/screens-autodiscovery.py >> /var/log/screens-autodiscovery.log 2>&1
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-blade-ctl.sh status >> /var/log/wevia-blade.log 2>&1
|
||||
*/10 * * * * bash /opt/weval-l99/wevia-pilot.sh
|
||||
@@ -353,9 +357,10 @@ wevia-webwide.py
|
||||
0 */6 * * * php /var/www/html/api/auto-key-renew.php >> /var/log/key-renew.log 2>&1
|
||||
0 */6 * * * sudo python3 /opt/weval-security/key-sync.py >> /var/log/security-sync.log 2>&1
|
||||
0 */6 * * * timeout 900 python3 /opt/weval-l99/l99-deep-scan.py >> /var/log/l99-deep-scan.log 2>&1
|
||||
0 1 * * * python3 /opt/ethica-enrich-v4.py 300 >> /var/log/ethica-enrich-v4.log 2>&1
|
||||
0 10 * * * python3 /opt/ethica-enrich-searxng.py 200 >> /var/log/ethica-enrich-searxng.log 2>&1
|
||||
0 11,23 * * * python3 /opt/ethica-richscraper.py 500 >> /var/log/ethica-richscraper.log 2>&1
|
||||
0 1 * * * python3 /opt/ethica-enrich-v4.py 600 >> /var/log/ethica-enrich-v4.log 2>&1
|
||||
0 10 * * * python3 /opt/ethica-enrich-searxng.py 500 >> /var/log/ethica-enrich-searxng.log 2>&1
|
||||
0 16 * * * python3 /opt/ethica-enrich-searxng.py 500 >> /var/log/ethica-enrich-searxng.log 2>&1 # V152 second run/day for DZ enrichment
|
||||
0 11,23 * * * python3 /opt/ethica-richscraper.py 1000 >> /var/log/ethica-richscraper.log 2>&1
|
||||
0 2 * * * /usr/bin/python3 /opt/weval-ops/kpi-snapshot-daily.py >> /var/log/weval/kpi-daily.log 2>&1
|
||||
0 2 * * 0 python3 /opt/tabibi-scraper.py >> /var/log/tabibi-scraper.log 2>&1
|
||||
0 3 * * * bash /opt/weval-l99/wtp-integrity-daily.sh >> /var/log/wtp-integrity.log 2>&1
|
||||
@@ -381,13 +386,13 @@ wevia-webwide.py
|
||||
## Ollama Models
|
||||
|
||||
## Docker (20 containers)
|
||||
weval-docuseal Up 5 seconds
|
||||
weval-docuseal Up 7 seconds
|
||||
loki Up 5 days
|
||||
listmonk Up 5 days
|
||||
listmonk Up 6 days
|
||||
plausible-plausible-1 Up 4 days
|
||||
plausible-plausible-db-1 Up 4 days
|
||||
plausible-plausible-events-db-1 Up 4 days
|
||||
n8n-docker-n8n-1 Up 5 days
|
||||
mattermost-docker-mm-db-1 Up 5 days
|
||||
mattermost-docker-mattermost-1 Up 5 days (healthy)
|
||||
twenty Up 5 days
|
||||
n8n-docker-n8n-1 Up 6 days
|
||||
mattermost-docker-mm-db-1 Up 6 days
|
||||
mattermost-docker-mattermost-1 Up 6 days (healthy)
|
||||
twenty Up 6 days
|
||||
|
||||
15
api/blade-tasks/key_gemini_key_20260422.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "key_renewal",
|
||||
"provider": "GEMINI_KEY",
|
||||
"reason": "FAIL",
|
||||
"urls": {
|
||||
"GITHUB_TOKEN": "https:\/\/github.com\/settings\/tokens\/new?scopes=repo,workflow&description=WEVIA-Auto",
|
||||
"GROQ_KEY": "https:\/\/console.groq.com\/keys",
|
||||
"CEREBRAS_API_KEY": "https:\/\/cloud.cerebras.ai\/platform",
|
||||
"GEMINI_KEY": "https:\/\/aistudio.google.com\/apikey",
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T10:05:31+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T10:06:37+00:00",
|
||||
"priority": "P0"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T10:06:37+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -10,6 +10,6 @@
|
||||
"SAMBANOVA_KEY": "https:\/\/cloud.sambanova.ai\/apis",
|
||||
"MISTRAL_KEY": "https:\/\/console.mistral.ai\/api-keys"
|
||||
},
|
||||
"ts": "2026-04-22T04:00:08+00:00",
|
||||
"ts": "2026-04-22T10:06:37+00:00",
|
||||
"priority": "P1"
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 08:00",
|
||||
"timestamp": "2026-04-22 16:00",
|
||||
"checks": {
|
||||
"registry": "0 agents",
|
||||
"system": {
|
||||
"docker": "20",
|
||||
"ram": "13Gi/30Gi",
|
||||
"disk": "86%",
|
||||
"load": "3.12",
|
||||
"uptime": "up 1 week, 20 hours, 8 minutes"
|
||||
"ram": "14Gi/30Gi",
|
||||
"disk": "87%",
|
||||
"load": "10.62",
|
||||
"uptime": "up 1 week, 1 day, 4 hours, 8 minutes"
|
||||
},
|
||||
"services": "8/10 OK",
|
||||
"services": "7/10 OK",
|
||||
"nonreg": "153/153 (100%)",
|
||||
"qdrant": "21259 vectors",
|
||||
"crons": "44 active",
|
||||
"routes": "446",
|
||||
"dataset": "5751 pairs",
|
||||
"wiki": "2252 entries",
|
||||
"wiki": "2324 entries",
|
||||
"enterprise": "758 agents (dorm=0 dead=167)"
|
||||
},
|
||||
"analysis": "Analyse indisponible"
|
||||
|
||||
@@ -0,0 +1,286 @@
|
||||
{
|
||||
"ts": "2026-04-22T14:55:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 16.07,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 14682,
|
||||
"ram_free_mb": 16652,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "124G",
|
||||
"disk_free": "20G",
|
||||
"disk_pct": "87%",
|
||||
"fpm_workers": 140,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.9,
|
||||
"disk_pct": "83%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 12095
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
"name": "SER6",
|
||||
"ip": "110.239.84.121",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER7",
|
||||
"ip": "110.239.65.64",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER8",
|
||||
"ip": "182.160.55.107",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER9",
|
||||
"ip": "110.239.86.68",
|
||||
"status": "DOWN"
|
||||
}
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 328,
|
||||
"php_apis": 1075,
|
||||
"wiki_entries": 2326,
|
||||
"vault_doctrines": 123,
|
||||
"vault_sessions": 104,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 649,
|
||||
"registry_version": "?"
|
||||
},
|
||||
"sovereign": {
|
||||
"status": "UP",
|
||||
"providers": [
|
||||
"Cerebras-fast",
|
||||
"Cerebras-think",
|
||||
"Groq",
|
||||
"Cloudflare-AI",
|
||||
"Gemini",
|
||||
"SambaNova",
|
||||
"NVIDIA-NIM",
|
||||
"Mistral",
|
||||
"Groq-OSS",
|
||||
"HF-Space",
|
||||
"HF-Router",
|
||||
"OpenRouter",
|
||||
"GitHub-Models"
|
||||
],
|
||||
"active": 13,
|
||||
"total": 13,
|
||||
"primary": "Cerebras-fast",
|
||||
"cost": "0€"
|
||||
},
|
||||
"ethica": {
|
||||
"total_hcps": 166742,
|
||||
"with_email": 110737,
|
||||
"with_phone": 159846,
|
||||
"gap_email": 56005,
|
||||
"pct_email": 66.4,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 127343,
|
||||
"with_email": 78612,
|
||||
"with_tel": 124087,
|
||||
"pct_email": 61.7,
|
||||
"pct_tel": 97.4
|
||||
},
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19724,
|
||||
"with_email": 15086,
|
||||
"with_tel": 18739,
|
||||
"pct_email": 76.5,
|
||||
"pct_tel": 95
|
||||
},
|
||||
{
|
||||
"country": "TN",
|
||||
"hcps": 17796,
|
||||
"with_email": 15160,
|
||||
"with_tel": 17020,
|
||||
"pct_email": 85.2,
|
||||
"pct_tel": 95.6
|
||||
},
|
||||
{
|
||||
"country": "INTL",
|
||||
"hcps": 1879,
|
||||
"with_email": 1879,
|
||||
"with_tel": 0,
|
||||
"pct_email": 100,
|
||||
"pct_tel": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"docker": [
|
||||
{
|
||||
"name": "weval-docuseal",
|
||||
"status": "Up 8 seconds",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mm-db-1",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mattermost-1",
|
||||
"status": "Up 6 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 6 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 2 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 8 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 8 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
"crons": {
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "8fbfe405e auto-sync-1655",
|
||||
"dirty": 1,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
"nonreg": {
|
||||
"total": 153,
|
||||
"passed": 153,
|
||||
"score": "100%"
|
||||
},
|
||||
"services": [
|
||||
{
|
||||
"name": "DeerFlow",
|
||||
"port": 3002,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "DeerFlow API",
|
||||
"port": 8001,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Qdrant",
|
||||
"port": 6333,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Ollama",
|
||||
"port": 11434,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Redis",
|
||||
"port": 6379,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Sovereign",
|
||||
"port": 4000,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "SearXNG",
|
||||
"port": 8080,
|
||||
"status": "UP"
|
||||
}
|
||||
],
|
||||
"whisper": {
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 4521,
|
||||
"health": {
|
||||
"score": 4,
|
||||
"max": 6,
|
||||
"pct": 67
|
||||
},
|
||||
"elapsed_ms": 11115
|
||||
}
|
||||
1
api/fix-wv-send.php
Normal file
@@ -0,0 +1 @@
|
||||
Voici le code complet pour le script `fix-wv-send.php` :
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 06:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"fast_php_routes": 446,
|
||||
"opt_tools_total": 54,
|
||||
"wired": 51,
|
||||
@@ -18,9 +18,8 @@
|
||||
"files": 10
|
||||
}
|
||||
],
|
||||
"docker_total": 20,
|
||||
"docker_total": 19,
|
||||
"docker_not_wired": [
|
||||
"weval-docuseal",
|
||||
"plausible-plausible-1",
|
||||
"plausible-plausible-db-1",
|
||||
"plausible-plausible-events-db-1",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"status": "ERROR"
|
||||
},
|
||||
"ports": {
|
||||
"total": 74,
|
||||
"total": 75,
|
||||
"exposed": 20,
|
||||
"ports": [
|
||||
{
|
||||
@@ -14,11 +14,11 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5890",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=12),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=12),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5888",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=10),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=10),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6060",
|
||||
@@ -30,23 +30,23 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5823",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=5),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=5),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5822",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=4),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=4),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5821",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=3),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=3),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5825",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=13),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=13),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:5824",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=6),(\"apache2\",pid"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=6),(\"apache2\",pid"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:6379",
|
||||
@@ -72,10 +72,6 @@
|
||||
"addr": "0.0.0.0:8765",
|
||||
"process": "users:((\"python3\",pid=1811016,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:34111",
|
||||
"process": "users:((\"ollama\",pid=1295666,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:2024",
|
||||
"process": "users:((\"langgraph\",pid=3664742,fd=16))"
|
||||
@@ -96,13 +92,17 @@
|
||||
"addr": "0.0.0.0:4000",
|
||||
"process": "users:((\"python3\",pid=1394482,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:45675",
|
||||
"process": "users:((\"ollama\",pid=2836223,fd=3))"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:2026",
|
||||
"process": "users:((\"nginx\",pid=3665702,fd=5),(\"nginx\",pid=366"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:443",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=5),(\"nginx\",pid=131"
|
||||
"process": "users:((\"nginx\",pid=2851406,fd=5),(\"nginx\",pid=285"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:49222",
|
||||
@@ -110,7 +110,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:80",
|
||||
"process": "users:((\"nginx\",pid=1873436,fd=6),(\"nginx\",pid=131"
|
||||
"process": "users:((\"nginx\",pid=2851406,fd=6),(\"nginx\",pid=285"
|
||||
},
|
||||
{
|
||||
"addr": "0.0.0.0:22",
|
||||
@@ -122,7 +122,7 @@
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:8443",
|
||||
"process": "users:((\"apache2\",pid=2669228,fd=11),(\"apache2\",pi"
|
||||
"process": "users:((\"apache2\",pid=2159098,fd=11),(\"apache2\",pi"
|
||||
},
|
||||
{
|
||||
"addr": "127.0.0.1:9050",
|
||||
@@ -161,7 +161,7 @@
|
||||
"status": "PASS"
|
||||
}
|
||||
},
|
||||
"timestamp": "2026-04-22T06:00:01",
|
||||
"timestamp": "2026-04-22T12:00:02",
|
||||
"oss_tools": [
|
||||
{
|
||||
"name": "Nuclei",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "daily",
|
||||
"timestamp": "2026-04-22 07:00",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"squads": {
|
||||
"infra": {
|
||||
"name": "INFRA",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T06:30:02.392649",
|
||||
"timestamp": "2026-04-22T12:30:02.650214",
|
||||
"source": "auto-populator-v2-fixed-18avr",
|
||||
"enterprise_total_agents": 747,
|
||||
"docker_total": 20,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[06:30:01] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[06:30:01] Enterprise: 747 agents
|
||||
[06:30:02] Registry: 11 sections
|
||||
[06:30:02] Docker: 20 containers
|
||||
[06:30:02] strat: 99 agents (38 active)
|
||||
[06:30:02] infra: 308 agents (34 active)
|
||||
[06:30:02] dev: 108 agents (25 active)
|
||||
[06:30:02] sec: 48 agents (13 active)
|
||||
[06:30:02] biz: 114 agents (31 active)
|
||||
[06:30:02] ia: 168 agents (48 active)
|
||||
[06:30:02] transit: 254 agents (27 active)
|
||||
[06:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
[12:30:02] === MEETING ROOMS AUTO-POPULATOR (FIXED 18avr) ===
|
||||
[12:30:02] Enterprise: 747 agents
|
||||
[12:30:02] Registry: 11 sections
|
||||
[12:30:02] Docker: 20 containers
|
||||
[12:30:02] strat: 99 agents (38 active)
|
||||
[12:30:02] infra: 308 agents (34 active)
|
||||
[12:30:02] dev: 108 agents (25 active)
|
||||
[12:30:02] sec: 48 agents (13 active)
|
||||
[12:30:02] biz: 114 agents (31 active)
|
||||
[12:30:02] ia: 168 agents (48 active)
|
||||
[12:30:02] transit: 254 agents (27 active)
|
||||
[12:30:02] Output: /var/www/html/api/meeting-rooms-data.json
|
||||
30
api/meetings/daily-2026-04-22-12-00.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 12:00",
|
||||
"squad": "infra",
|
||||
"agents": {
|
||||
"cortex": {
|
||||
"done": "13 checks, services 8\/10 OK",
|
||||
"blockers": "none",
|
||||
"next": "Continue monitoring *\/4h"
|
||||
},
|
||||
"gap_detector": {
|
||||
"done": "Score 94.4% (51\/54 wired)",
|
||||
"blockers": "3 tools not wired",
|
||||
"next": "Wire remaining tools"
|
||||
},
|
||||
"nonreg": {
|
||||
"done": "153\/153 (100%)",
|
||||
"blockers": "none",
|
||||
"next": "Maintain 100%"
|
||||
},
|
||||
"security": {
|
||||
"done": "0 leaks, 92 expositions redacted, CrowdSec active",
|
||||
"blockers": "none",
|
||||
"next": "Continuous monitoring"
|
||||
}
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "LLM unavailable"
|
||||
}
|
||||
30
api/meetings/daily-2026-04-22-12-30.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 12:30",
|
||||
"squad": "innovation",
|
||||
"agents": {
|
||||
"evolution": {
|
||||
"done": "System: ? routes, ? skills",
|
||||
"blockers": "Agent PHP syntax to fix",
|
||||
"next": "Generate 5 evolution proposals"
|
||||
},
|
||||
"scanner": {
|
||||
"done": "12 sections wiki scanned",
|
||||
"blockers": "none",
|
||||
"next": "Continue *\/2h"
|
||||
},
|
||||
"l99": {
|
||||
"done": "Functional ?\/93, Dark 7\/10",
|
||||
"blockers": "gitleaks+trivy version format mismatch",
|
||||
"next": "Fix dark test parsing"
|
||||
},
|
||||
"mirofish": {
|
||||
"done": "MiroFish DOWN",
|
||||
"blockers": "Service down",
|
||||
"next": "Collaborative tools"
|
||||
}
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "{\n \"conflicts\": [\n \"Agent PHP syntax to fix (blocker pour evolution) pourrait impacter la génération des routes\/skills nécessaires à d'autres agents\",\n \"MiroFish DOWN (mirofish) peut bloquer les agents dépendants d'outils collaboratifs, potentiellement scanner ou coordination interne\"\n ],\n \"common_issues\": [\n \"Problèmes liés à des dépendances techniques externes (versions gitleaks+trivy, syntaxe PHP, service down)\",\n \"Indicateurs de progression partiellement inconnus (?) chez evolution et mirofish, réduisant la visibilité\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer evolution\",\n \"Restaurer le service MiroFish (urgence opérationnelle)\",\n \"Résoudre le mismatch de format de version entre gitleaks et trivy pour l'agent l99\"\n ],\n \"conciliation\": [\n \"Coordonner l99 et evolution si la correction du parsing ou de la syntaxe affecte les mêmes composants système\",\n \"Vérifier si le scanner peut continuer malgré la panne de MiroFish ; sinon, rediriger temporairement vers une tâche autonome\"\n ]\n}"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "DAILY STANDUP",
|
||||
"timestamp": "2026-04-22 06:30",
|
||||
"timestamp": "2026-04-22 12:30",
|
||||
"squad": "innovation",
|
||||
"agents": {
|
||||
"evolution": {
|
||||
@@ -26,5 +26,5 @@
|
||||
},
|
||||
"conflicts": [],
|
||||
"actions": [],
|
||||
"ai_analysis": "```json\n{\n \"conflicts\": [\n \"Agent PHP syntax error (blocking 'evolution') could impact code generation needed by other agents\",\n \"MiroFish DOWN affects collaborative tools access, potentially blocking coordination (mirofish vs all)\"\n ],\n \"common_issues\": [\n \"Service stability issues (gitleaks+trivy version mismatch, MiroFish down)\",\n \"Incomplete functional coverage (dark tests, missing skill\/route tracking)\"\n ],\n \"priority_actions\": [\n \"Fix MiroFish service outage to restore collaboration capabilities\",\n \"Resolve gitleaks+trivy version mismatch to unblock l99 dark test parsing\",\n \"Fix Agent PHP syntax to enable evolution module to generate proposals\"\n ],\n \"conciliation\": [\n \"Align l99 and evolution on shared dependency versions to prevent future mismatches\",\n \"Coordinate scanner's 2h cycle with evolution's proposal timeline to ensure updated data is used\"\n ]\n}\n```"
|
||||
"ai_analysis": "{\n \"conflicts\": [\n \"Agent PHP syntax to fix (blocker pour evolution) pourrait impacter la génération des routes\/skills nécessaires à d'autres agents\",\n \"MiroFish DOWN (mirofish) peut bloquer les agents dépendants d'outils collaboratifs, potentiellement scanner ou coordination interne\"\n ],\n \"common_issues\": [\n \"Problèmes liés à des dépendances techniques externes (versions gitleaks+trivy, syntaxe PHP, service down)\",\n \"Indicateurs de progression partiellement inconnus (?) chez evolution et mirofish, réduisant la visibilité\"\n ],\n \"priority_actions\": [\n \"Réparer la syntaxe PHP pour débloquer evolution\",\n \"Restaurer le service MiroFish (urgence opérationnelle)\",\n \"Résoudre le mismatch de format de version entre gitleaks et trivy pour l'agent l99\"\n ],\n \"conciliation\": [\n \"Coordonner l99 et evolution si la correction du parsing ou de la syntaxe affecte les mêmes composants système\",\n \"Vérifier si le scanner peut continuer malgré la panne de MiroFish ; sinon, rediriger temporairement vers une tâche autonome\"\n ]\n}"
|
||||
}
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-22T09:10:02+00:00",
|
||||
"ts": "2026-04-22T14:50:02+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
"signals_tracked": {
|
||||
"wtp_engagement": 100,
|
||||
"wtp_engagement": 62,
|
||||
"chat_engagement": 0,
|
||||
"roi_tool": 0,
|
||||
"email_opened": 0
|
||||
},
|
||||
"avg_score": 25,
|
||||
"avg_score": 15.5,
|
||||
"mql_threshold": 50,
|
||||
"sql_threshold": 75,
|
||||
"leads_captured": 48,
|
||||
"mql_auto_scored": 20,
|
||||
"mql_auto_scored": 19,
|
||||
"sql_auto_scored": 8,
|
||||
"mql_auto_pct": 41,
|
||||
"mql_auto_pct": 39,
|
||||
"improvement_vs_manual": {
|
||||
"before_manual_pct": 33.3,
|
||||
"after_auto_pct": 41,
|
||||
"delta": 7.700000000000003
|
||||
"after_auto_pct": 39,
|
||||
"delta": 5.700000000000003
|
||||
},
|
||||
"paperclip_db_ok": true,
|
||||
"paperclip_tables": 2,
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.405306"
|
||||
"discovered": "2026-04-22T16:00:04.904266"
|
||||
},
|
||||
{
|
||||
"name": "wevia-brain",
|
||||
@@ -23,7 +23,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.423221"
|
||||
"discovered": "2026-04-22T16:00:05.200526"
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
@@ -36,7 +36,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.348568"
|
||||
"discovered": "2026-04-22T16:00:04.834544"
|
||||
},
|
||||
{
|
||||
"name": "everything-claude-code",
|
||||
@@ -49,7 +49,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.",
|
||||
"discovered": "2026-04-22T11:00:02.186581"
|
||||
"discovered": "2026-04-22T16:00:04.556081"
|
||||
},
|
||||
{
|
||||
"name": "open-webui-fresh",
|
||||
@@ -62,7 +62,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# Open WebUI 👋   | [中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md) | [Tiếng Việt](README.vi.md) | [Português](README.p",
|
||||
"discovered": "2026-04-22T11:00:02.219735"
|
||||
"discovered": "2026-04-22T16:00:04.637103"
|
||||
},
|
||||
{
|
||||
"name": "mxyhi_ok-skills",
|
||||
@@ -114,7 +114,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# OK Skills: AI Coding Agent Skills for Codex, Claude Code, Cursor, OpenClaw, and More English | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | ",
|
||||
"discovered": "2026-04-22T11:00:02.215373"
|
||||
"discovered": "2026-04-22T16:00:04.632917"
|
||||
},
|
||||
{
|
||||
"name": "SuperClaude_Framework",
|
||||
@@ -127,7 +127,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> # 🚀 SuperClaude Framework [](https://smithery.ai/skills?ns=",
|
||||
"discovered": "2026-04-22T11:00:01.958048"
|
||||
"discovered": "2026-04-22T16:00:04.119627"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-weval",
|
||||
@@ -140,7 +140,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "<p align=\"center\"> <img src=\"doc/assets/header.png\" alt=\"Paperclip — runs your business\" width=\"720\" /> </p> <p align=\"center\"> <a href=\"#quickst",
|
||||
"discovered": "2026-04-22T11:00:02.227914"
|
||||
"discovered": "2026-04-22T16:00:04.665683"
|
||||
},
|
||||
{
|
||||
"name": "vllm",
|
||||
@@ -153,7 +153,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<!-- markdownlint-disable MD001 MD041 --> <p align=\"center\"> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubus",
|
||||
"discovered": "2026-04-22T11:00:02.376553"
|
||||
"discovered": "2026-04-22T16:00:04.883981"
|
||||
},
|
||||
{
|
||||
"name": "deer-flow",
|
||||
@@ -166,7 +166,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# 🦌 DeerFlow - 2.0 English | [中文](./README_zh.md) | [日本語](./README_ja.md) | [Français](./README_fr.md) | [Русский](./README_ru.md) [ [](https://agent.xfyun.cn) <div align=\"center\"> [ | [Français](docs/translations/README.fr.md) | [Italiano](docs/translations/README.it.md) | ",
|
||||
"discovered": "2026-04-22T11:00:01.936304"
|
||||
"discovered": "2026-04-22T16:00:04.005571"
|
||||
},
|
||||
{
|
||||
"name": "aios",
|
||||
@@ -374,7 +374,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "# AIOS: AI Agent Operating System <a href='https://arxiv.org/abs/2403.16971'><img src='https://img.shields.io/badge/Paper-PDF-red'></a> <a href='http",
|
||||
"discovered": "2026-04-22T11:00:02.011046"
|
||||
"discovered": "2026-04-22T16:00:04.274978"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agent-framework",
|
||||
@@ -387,7 +387,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": " # Welcome to Microsoft Agent Framework! [\"> <source srcset=\"apps/w",
|
||||
"discovered": "2026-04-22T11:00:02.368122"
|
||||
"discovered": "2026-04-22T16:00:04.868256"
|
||||
},
|
||||
{
|
||||
"name": "fmgapp",
|
||||
@@ -478,7 +478,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.188792"
|
||||
"discovered": "2026-04-22T16:00:04.568227"
|
||||
},
|
||||
{
|
||||
"name": "obsidian-vault",
|
||||
@@ -491,7 +491,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.217445"
|
||||
"discovered": "2026-04-22T16:00:04.635033"
|
||||
},
|
||||
{
|
||||
"name": "rnd-agents",
|
||||
@@ -504,7 +504,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Claude Code Plugins: Orchestration and Automation > **⚡ Updated for Opus 4.6, Sonnet 4.6 & Haiku 4.5** — Three-tier model strategy for optimal perf",
|
||||
"discovered": "2026-04-22T11:00:02.249188"
|
||||
"discovered": "2026-04-22T16:00:04.720947"
|
||||
},
|
||||
{
|
||||
"name": "FrancyJGLisboa_agent-skill-creator",
|
||||
@@ -517,7 +517,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Agent Skill Creator **Turn any workflow into reusable AI agent software that installs on 14+ tools — no spec writing, no prompt engineering, no cod",
|
||||
"discovered": "2026-04-22T11:00:01.842178"
|
||||
"discovered": "2026-04-22T16:00:03.975411"
|
||||
},
|
||||
{
|
||||
"name": "oss",
|
||||
@@ -530,7 +530,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# WEVAL OSS Registry · /opt/oss/ Wave 222 · 2026-04-21 ## Purpose Register the OSS tools identified by AI capability gap audit (wave 220 ai-gap-cach",
|
||||
"discovered": "2026-04-22T11:00:02.224009"
|
||||
"discovered": "2026-04-22T16:00:04.642327"
|
||||
},
|
||||
{
|
||||
"name": "scripts",
|
||||
@@ -543,7 +543,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Token Rotation Scripts · Opus Session 21-avr v7 ## État - 5 scripts provider skeleton (groq, github, sambanova, alibaba, whatsapp) - 1 master dispa",
|
||||
"discovered": "2026-04-22T11:00:02.340359"
|
||||
"discovered": "2026-04-22T16:00:04.778468"
|
||||
},
|
||||
{
|
||||
"name": "skillsmith",
|
||||
@@ -556,7 +556,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<div align=\"center\"> <img src=\"terminal.svg\" alt=\"Skillsmith terminal\" width=\"740\"/> </div> <div align=\"center\"> # Skillsmith **Build consistent ",
|
||||
"discovered": "2026-04-22T11:00:02.350535"
|
||||
"discovered": "2026-04-22T16:00:04.840178"
|
||||
},
|
||||
{
|
||||
"name": "awesome-agent-skills",
|
||||
@@ -569,7 +569,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "<a href=\"https://github.com/VoltAgent/voltagent\"> <img width=\"1500\" height=\"801\" alt=\"claude-skills\" src=\"https://github.com/user-attachments/ass",
|
||||
"discovered": "2026-04-22T11:00:02.138130"
|
||||
"discovered": "2026-04-22T16:00:04.473098"
|
||||
},
|
||||
{
|
||||
"name": "paperclip-skills",
|
||||
@@ -582,7 +582,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.225918"
|
||||
"discovered": "2026-04-22T16:00:04.649266"
|
||||
},
|
||||
{
|
||||
"name": "__pycache__",
|
||||
@@ -595,7 +595,7 @@
|
||||
"has_docker": false,
|
||||
"wired": false,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:01.963571"
|
||||
"discovered": "2026-04-22T16:00:04.188021"
|
||||
},
|
||||
{
|
||||
"name": "jzOcb_writing-style-skill",
|
||||
@@ -608,7 +608,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "# Writing Style Skill 可复用的写作风格 Skill 模板。**内置自动学习** — 从你的修改中自动提取规则,SKILL.md 越用越准。 兼容 **Claude Code** + **OpenClaw (ClawHub)**。 ## 原理 ``` AI 用 SKILL",
|
||||
"discovered": "2026-04-22T11:00:02.192923"
|
||||
"discovered": "2026-04-22T16:00:04.609401"
|
||||
},
|
||||
{
|
||||
"name": "qdrant-data",
|
||||
@@ -621,7 +621,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.240746"
|
||||
"discovered": "2026-04-22T16:00:04.694487"
|
||||
},
|
||||
{
|
||||
"name": "wazuh",
|
||||
@@ -634,7 +634,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.381261"
|
||||
"discovered": "2026-04-22T16:00:04.888312"
|
||||
},
|
||||
{
|
||||
"name": "plausible",
|
||||
@@ -647,7 +647,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.229905"
|
||||
"discovered": "2026-04-22T16:00:04.671970"
|
||||
},
|
||||
{
|
||||
"name": "pmta",
|
||||
@@ -660,7 +660,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.231890"
|
||||
"discovered": "2026-04-22T16:00:04.673951"
|
||||
},
|
||||
{
|
||||
"name": "render-configs",
|
||||
@@ -673,7 +673,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.242893"
|
||||
"discovered": "2026-04-22T16:00:04.702077"
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
@@ -686,7 +686,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.344641"
|
||||
"discovered": "2026-04-22T16:00:04.785429"
|
||||
},
|
||||
{
|
||||
"name": "weval-guardian",
|
||||
@@ -699,7 +699,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.400378"
|
||||
"discovered": "2026-04-22T16:00:04.897695"
|
||||
},
|
||||
{
|
||||
"name": "weval-litellm",
|
||||
@@ -712,7 +712,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.407669"
|
||||
"discovered": "2026-04-22T16:00:04.906542"
|
||||
},
|
||||
{
|
||||
"name": "weval-security",
|
||||
@@ -725,7 +725,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.419062"
|
||||
"discovered": "2026-04-22T16:00:05.116508"
|
||||
},
|
||||
{
|
||||
"name": "archive",
|
||||
@@ -738,7 +738,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.073055"
|
||||
"discovered": "2026-04-22T16:00:04.433680"
|
||||
},
|
||||
{
|
||||
"name": "loki",
|
||||
@@ -751,7 +751,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.207122"
|
||||
"discovered": "2026-04-22T16:00:04.624584"
|
||||
},
|
||||
{
|
||||
"name": "ruflo",
|
||||
@@ -764,7 +764,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.335175"
|
||||
"discovered": "2026-04-22T16:00:04.760090"
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
@@ -777,7 +777,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.372346"
|
||||
"discovered": "2026-04-22T16:00:04.876920"
|
||||
},
|
||||
{
|
||||
"name": "weval-cli",
|
||||
@@ -790,7 +790,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.396583"
|
||||
"discovered": "2026-04-22T16:00:04.893874"
|
||||
},
|
||||
{
|
||||
"name": "weval-crewai",
|
||||
@@ -803,7 +803,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.398532"
|
||||
"discovered": "2026-04-22T16:00:04.895744"
|
||||
},
|
||||
{
|
||||
"name": "weval-plugins",
|
||||
@@ -816,7 +816,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.413447"
|
||||
"discovered": "2026-04-22T16:00:04.992116"
|
||||
},
|
||||
{
|
||||
"name": "weval-radar",
|
||||
@@ -829,7 +829,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.415169"
|
||||
"discovered": "2026-04-22T16:00:05.033237"
|
||||
},
|
||||
{
|
||||
"name": "weval-scrapy",
|
||||
@@ -842,7 +842,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.417079"
|
||||
"discovered": "2026-04-22T16:00:05.083688"
|
||||
},
|
||||
{
|
||||
"name": "blade",
|
||||
@@ -855,7 +855,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.161586"
|
||||
"discovered": "2026-04-22T16:00:04.514364"
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
@@ -868,7 +868,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.194833"
|
||||
"discovered": "2026-04-22T16:00:04.612254"
|
||||
},
|
||||
{
|
||||
"name": "litellm",
|
||||
@@ -881,7 +881,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.203093"
|
||||
"discovered": "2026-04-22T16:00:04.620647"
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker",
|
||||
@@ -894,7 +894,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.209081"
|
||||
"discovered": "2026-04-22T16:00:04.626696"
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
@@ -907,7 +907,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.238183"
|
||||
"discovered": "2026-04-22T16:00:04.687396"
|
||||
},
|
||||
{
|
||||
"name": "twenty-compose",
|
||||
@@ -920,7 +920,7 @@
|
||||
"has_docker": true,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.374523"
|
||||
"discovered": "2026-04-22T16:00:04.878904"
|
||||
},
|
||||
{
|
||||
"name": "weval-ux",
|
||||
@@ -933,7 +933,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.421036"
|
||||
"discovered": "2026-04-22T16:00:05.141580"
|
||||
},
|
||||
{
|
||||
"name": "wevia-integrity",
|
||||
@@ -946,7 +946,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.426909"
|
||||
"discovered": "2026-04-22T16:00:05.275469"
|
||||
},
|
||||
{
|
||||
"name": "DiffusionDB",
|
||||
@@ -959,7 +959,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:01.811452"
|
||||
"discovered": "2026-04-22T16:00:03.874622"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video",
|
||||
@@ -972,7 +972,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:01.946230"
|
||||
"discovered": "2026-04-22T16:00:04.019250"
|
||||
},
|
||||
{
|
||||
"name": "localai",
|
||||
@@ -985,7 +985,7 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.205147"
|
||||
"discovered": "2026-04-22T16:00:04.622588"
|
||||
},
|
||||
{
|
||||
"name": "wevia-finetune",
|
||||
@@ -998,6 +998,6 @@
|
||||
"has_docker": false,
|
||||
"wired": true,
|
||||
"description": "",
|
||||
"discovered": "2026-04-22T11:00:02.425086"
|
||||
"discovered": "2026-04-22T16:00:05.245774"
|
||||
}
|
||||
]
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"date": "2026-04-22 04:00:02",
|
||||
"date": "2026-04-22 10:00:03",
|
||||
"query": "multi-agent orchestration",
|
||||
"new_repos": 0,
|
||||
"cloned": 0,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22T11:00:13",
|
||||
"timestamp": "2026-04-22T16:30:17",
|
||||
"features": {
|
||||
"total": 36,
|
||||
"pass": 35
|
||||
@@ -13,7 +13,7 @@
|
||||
"score": 97.2,
|
||||
"log": [
|
||||
"=== UX AGENT v1.0 ===",
|
||||
"Time: 2026-04-22 11:00:01",
|
||||
"Time: 2026-04-22 16:30:02",
|
||||
" core: 4/4",
|
||||
" layout: 3/4",
|
||||
" interaction: 6/6",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V81-AI-AUDIT-100",
|
||||
"ts": "2026-04-18T12:22:41+00:00",
|
||||
"ts": "2026-04-22T13:56:18+00:00",
|
||||
"standards": [
|
||||
"NIST AI RMF",
|
||||
"ISO\/IEC 23894",
|
||||
@@ -10,12 +10,12 @@
|
||||
"Stanford HAI"
|
||||
],
|
||||
"total": 100,
|
||||
"passed": 100,
|
||||
"failed": 0,
|
||||
"score": 100,
|
||||
"passed": 99,
|
||||
"failed": 1,
|
||||
"score": 99,
|
||||
"by_category": {
|
||||
"avail": {
|
||||
"pass": 10,
|
||||
"pass": 9,
|
||||
"total": 10
|
||||
},
|
||||
"acc": {
|
||||
@@ -93,7 +93,7 @@
|
||||
"label": "Registry tools >= 500",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "617 tools",
|
||||
"detail": "649 tools",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -109,15 +109,15 @@
|
||||
"label": "Disk usage < 90%",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "79%",
|
||||
"detail": "87%",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
"id": "avail_08_load_ok",
|
||||
"label": "Load average < 10",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "load 1.04",
|
||||
"pass": false,
|
||||
"score": 0,
|
||||
"detail": "load 15.30",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -133,7 +133,7 @@
|
||||
"label": "Cron jobs active >= 50",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "116 active crons",
|
||||
"detail": "149 active crons",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -197,7 +197,7 @@
|
||||
"label": "Skills OSS >= 5000",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "5651 skills",
|
||||
"detail": "5654 skills",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -213,7 +213,7 @@
|
||||
"label": "Ethica HCP DB >= 150k",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "151709 HCPs",
|
||||
"detail": "166742 HCPs",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -397,7 +397,7 @@
|
||||
"label": "Wiki V-files >= 30",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "41 wiki files",
|
||||
"detail": "98 wiki files",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -405,7 +405,7 @@
|
||||
"label": "Doctrines >= 50",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "58 doctrines",
|
||||
"detail": "124 doctrines",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -413,7 +413,7 @@
|
||||
"label": "Session snapshots vault",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "94 sessions",
|
||||
"detail": "145 sessions",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -421,7 +421,7 @@
|
||||
"label": "plan-action-dp.md live",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "2215 lines",
|
||||
"detail": "2310 lines",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
@@ -453,7 +453,7 @@
|
||||
"label": "GOLD backups before mods",
|
||||
"pass": true,
|
||||
"score": 1,
|
||||
"detail": "1597 golds",
|
||||
"detail": "1614 golds",
|
||||
"evidence": null
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-22T09:11:34+00:00",
|
||||
"ts": "2026-04-22T14:55:52+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
|
||||
@@ -39,6 +39,32 @@ function wevia_fast_path($msg) {
|
||||
$m = mb_strtolower(trim($msg));
|
||||
$r = null;
|
||||
// PRIORITY BYPASS
|
||||
if (preg_match('/reconcil|bilan|dirty|l99|saas|tout.*verif|ethica.*pays|ethica.*valid|ethica.*enrich|ethica.*campag|ethica.*maroc|ethica.*tunisie|ethica.*alger|medecins.*maroc|medecins.*tunisie|medecins.*alger|specialite|gap.*detail|ethica.*count|ethica.*countries|ethica.*repartition|hcp.*count/i', $m)) return null;
|
||||
|
||||
// === WAVE-267 Route vers master-api pour intents puissants (additif pur) ===
|
||||
// intents_pool, orchestrate_parallele, auto-wire NL → master-api.php (qui sait faire)
|
||||
if (preg_match('/^intents.?pool$|^pool.?intents$|combien.*capacit|nombre.*intent|liste.*intent|quelles.*capacit/i', $m)
|
||||
|| preg_match('/^orchestrate.*(en.*parallele|parallele.*:|:)/i', $m)
|
||||
|| preg_match('/^cable un intent |^wire.*intent|cree un intent pour|nouveau.*intent.*pour/i', $m)
|
||||
|| preg_match('/^quelle.*heure|^donne.*heure|^date serveur/i', $m)
|
||||
|| preg_match('/^multiagent|^multi.?agent.*(parallele|verifier|check)|^mobilise.*agent/i', $m)) {
|
||||
$ch = curl_init('http://127.0.0.1/api/wevia-master-api.php');
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['message' => $msg]));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
|
||||
$resp = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
if ($resp) {
|
||||
$j = @json_decode($resp, true);
|
||||
if (is_array($j) && isset($j['content'])) {
|
||||
return ['tool' => ($j['tool'] ?? 'master-api'), 'content' => $j['content'], 'provider' => ($j['provider'] ?? 'master-api')];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// === END WAVE-267 ===
|
||||
|
||||
if (preg_match('/reconcil|bilan|dirty|l99|saas|tout.*verif|ethica.*pays|ethica.*valid|ethica.*enrich|ethica.*campag|ethica.*maroc|ethica.*tunisie|ethica.*alger|medecins.*maroc|medecins.*tunisie|medecins.*alger|specialite|gap.*detail|ethica.*count|ethica.*countries|ethica.*repartition|hcp.*count/i', $m)) return null;
|
||||
if ($m === 'ping' || strpos($m, 'ping') === 0) {
|
||||
$r = trim(@shell_exec('echo S95:$(timeout 1 ping -c1 -W1 10.1.0.3 2>/dev/null | grep -oP "time=\K[0-9.]+") Groq:$(curl -so/dev/null -w%{http_code} -m2 https://api.groq.com 2>/dev/null)'));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-22 06:00:02",
|
||||
"timestamp": "2026-04-22 14:00:03",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Lean Six Sigma",
|
||||
@@ -8,7 +8,7 @@
|
||||
{
|
||||
"name": "KPIs defined",
|
||||
"ok": true,
|
||||
"detail": "Quality=98.6%"
|
||||
"detail": "Quality=98.3%"
|
||||
},
|
||||
{
|
||||
"name": "Monitoring",
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"name": "Quality>95",
|
||||
"ok": true,
|
||||
"detail": "98.6%"
|
||||
"detail": "98.3%"
|
||||
},
|
||||
{
|
||||
"name": "Auto-fix",
|
||||
@@ -46,7 +46,7 @@
|
||||
{
|
||||
"name": "Change Mgmt",
|
||||
"ok": true,
|
||||
"detail": "3747 commits\/7d"
|
||||
"detail": "3808 commits\/7d"
|
||||
},
|
||||
{
|
||||
"name": "SLA Monitor",
|
||||
@@ -84,7 +84,7 @@
|
||||
{
|
||||
"name": "Nonconformity",
|
||||
"ok": true,
|
||||
"detail": "98.6%"
|
||||
"detail": "98.3%"
|
||||
}
|
||||
],
|
||||
"s": 3,
|
||||
@@ -135,7 +135,7 @@
|
||||
{
|
||||
"name": "Disk<85%",
|
||||
"ok": false,
|
||||
"detail": "86%"
|
||||
"detail": "87%"
|
||||
},
|
||||
{
|
||||
"name": "Local inference",
|
||||
@@ -153,7 +153,7 @@
|
||||
{
|
||||
"name": "CI\/CD",
|
||||
"ok": true,
|
||||
"detail": "3747 commits"
|
||||
"detail": "3808 commits"
|
||||
},
|
||||
{
|
||||
"name": "Auto testing",
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
},
|
||||
{
|
||||
"layer": "PHP-API",
|
||||
"name": "1036/1046 syntax OK",
|
||||
"name": "1065/1075 syntax OK",
|
||||
"status": "F",
|
||||
"detail": "10 errors"
|
||||
},
|
||||
@@ -82,7 +82,7 @@
|
||||
"layer": "CRON",
|
||||
"name": "quality",
|
||||
"status": "F",
|
||||
"detail": "12660min ago"
|
||||
"detail": "13141min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -99,14 +99,14 @@
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "control-tower",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "91min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "l99-ux",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"detail": "271min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -136,13 +136,13 @@
|
||||
"layer": "CRON",
|
||||
"name": "selfmanage",
|
||||
"status": "P",
|
||||
"detail": "0min ago"
|
||||
"detail": "1min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
"name": "blade",
|
||||
"status": "F",
|
||||
"detail": "151min ago"
|
||||
"status": "P",
|
||||
"detail": "1min ago"
|
||||
},
|
||||
{
|
||||
"layer": "CRON",
|
||||
@@ -154,31 +154,31 @@
|
||||
"layer": "CRON",
|
||||
"name": "watchdog",
|
||||
"status": "F",
|
||||
"detail": "12132min ago"
|
||||
"detail": "12613min ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-artifacts-index.json",
|
||||
"status": "F",
|
||||
"detail": "valid 279h ago"
|
||||
"detail": "valid 287h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 298h ago"
|
||||
"detail": "valid 306h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-auth-selenium-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 281h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -190,259 +190,259 @@
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-prev.json",
|
||||
"status": "F",
|
||||
"detail": "valid 276h ago"
|
||||
"detail": "valid 284h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-autonomous-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 223h ago"
|
||||
"detail": "valid 231h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-brain-chat-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 262h ago"
|
||||
"detail": "valid 270h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-chat-user-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 250h ago"
|
||||
"detail": "valid 258h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-dark-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 280h ago"
|
||||
"detail": "valid 288h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 247h ago"
|
||||
"detail": "valid 255h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 262h ago"
|
||||
"detail": "valid 270h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-deep.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 394h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-e2e-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 345h ago"
|
||||
"detail": "valid 353h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-enterprise-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 77h ago"
|
||||
"detail": "valid 85h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-exhaustive.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-full-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 281h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-functional-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 248h ago"
|
||||
"detail": "valid 256h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-godmode-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 260h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-meeting-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 394h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-benchmark.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-check.json",
|
||||
"status": "F",
|
||||
"detail": "valid 212h ago"
|
||||
"detail": "valid 220h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 58h ago"
|
||||
"detail": "valid 66h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-mega-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-opus-parity.json",
|
||||
"status": "F",
|
||||
"detail": "valid 276h ago"
|
||||
"detail": "valid 284h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-integration.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-master.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-pw-public.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-route-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-security.json",
|
||||
"status": "P",
|
||||
"detail": "valid 2h ago"
|
||||
"detail": "valid 4h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 256h ago"
|
||||
"detail": "valid 264h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-semantic-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 212h ago"
|
||||
"detail": "valid 220h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-state.json",
|
||||
"status": "F",
|
||||
"detail": "valid 126h ago"
|
||||
"detail": "valid 134h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-systematic.json",
|
||||
"status": "F",
|
||||
"detail": "valid 249h ago"
|
||||
"detail": "valid 257h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ultimate.json",
|
||||
"status": "F",
|
||||
"detail": "valid 273h ago"
|
||||
"detail": "valid 281h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-ux-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 213h ago"
|
||||
"detail": "valid 221h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 386h ago"
|
||||
"detail": "valid 394h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-extended-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 250h ago"
|
||||
"detail": "valid 258h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-result.json",
|
||||
"status": "F",
|
||||
"detail": "valid 252h ago"
|
||||
"detail": "valid 260h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-visual-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 42h ago"
|
||||
"detail": "valid 50h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "l99-watchdog.json",
|
||||
"status": "F",
|
||||
"detail": "valid 248h ago"
|
||||
"detail": "valid 256h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-log.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-actions-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-pack-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 223h ago"
|
||||
"detail": "valid 231h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-agents-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 196h ago"
|
||||
"detail": "valid 204h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -454,7 +454,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-architecture.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -466,7 +466,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-autodoc.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -484,85 +484,85 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capabilities.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-capability-test.json",
|
||||
"status": "F",
|
||||
"detail": "valid 305h ago"
|
||||
"detail": "valid 313h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-cascade-config.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-control-tower.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-daily-report.json",
|
||||
"status": "P",
|
||||
"detail": "valid 2h ago"
|
||||
"detail": "valid 10h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-fleet-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 367h ago"
|
||||
"detail": "valid 375h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-analysis.json",
|
||||
"status": "F",
|
||||
"detail": "valid 306h ago"
|
||||
"detail": "valid 314h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-gap-filler-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-intent-proposals.json",
|
||||
"status": "P",
|
||||
"detail": "valid 8h ago"
|
||||
"detail": "valid 16h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-live-context.json",
|
||||
"status": "F",
|
||||
"detail": "valid 275h ago"
|
||||
"detail": "valid 283h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-manifest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-brain.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-master-test-results.json",
|
||||
"status": "F",
|
||||
"detail": "valid 305h ago"
|
||||
"detail": "valid 313h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-meeting-report.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -574,7 +574,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-page-scan.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -586,7 +586,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-plugin-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 110h ago"
|
||||
"detail": "valid 118h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -604,7 +604,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-quality.json",
|
||||
"status": "F",
|
||||
"detail": "valid 367h ago"
|
||||
"detail": "valid 375h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -616,7 +616,7 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-regression-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 387h ago"
|
||||
"detail": "valid 395h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
@@ -628,49 +628,49 @@
|
||||
"layer": "JSON",
|
||||
"name": "wevia-sso-guardian.json",
|
||||
"status": "F",
|
||||
"detail": "valid 365h ago"
|
||||
"detail": "valid 373h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-standup-latest.json",
|
||||
"status": "F",
|
||||
"detail": "valid 58h ago"
|
||||
"detail": "valid 66h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-last.json",
|
||||
"status": "F",
|
||||
"detail": "valid 224h ago"
|
||||
"detail": "valid 232h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-systematic-status.json",
|
||||
"status": "F",
|
||||
"detail": "valid 125h ago"
|
||||
"detail": "valid 133h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-tool-registry.json",
|
||||
"status": "P",
|
||||
"detail": "valid 3h ago"
|
||||
"detail": "valid 11h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-truth-registry.json",
|
||||
"status": "F",
|
||||
"detail": "valid 62h ago"
|
||||
"detail": "valid 70h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-ux-audit.json",
|
||||
"status": "F",
|
||||
"detail": "valid 364h ago"
|
||||
"detail": "valid 372h ago"
|
||||
},
|
||||
{
|
||||
"layer": "JSON",
|
||||
"name": "wevia-wiki-entries.json",
|
||||
"status": "P",
|
||||
"detail": "valid 17h ago"
|
||||
"status": "F",
|
||||
"detail": "valid 25h ago"
|
||||
},
|
||||
{
|
||||
"layer": "PIPELINE",
|
||||
@@ -871,15 +871,15 @@
|
||||
"detail": "69 tables"
|
||||
}
|
||||
],
|
||||
"timestamp": "2026-04-22T08:30:02.523149",
|
||||
"timestamp": "2026-04-22T16:30:02.159206",
|
||||
"type": "register",
|
||||
"pass": 56,
|
||||
"fail": 89,
|
||||
"pass": 57,
|
||||
"fail": 88,
|
||||
"warn": 0,
|
||||
"total": 145,
|
||||
"pct": 38.6,
|
||||
"pct": 39.3,
|
||||
"inventory": {
|
||||
"api_php": 1046,
|
||||
"api_php": 1075,
|
||||
"brain_php": 254,
|
||||
"crons": 14,
|
||||
"json_status": 42,
|
||||
|
||||
@@ -97,5 +97,23 @@
|
||||
"code": "sequenceDiagram\n participant U as Utilisateur\n participant S as Serveur\n U->>S: Demande de connexion\n S->>U: Réponse de connexion\n U->>S: Envoi de données\n S->>U: Traitement des données\n U->>S: Demande de données\n S->>U: Envoi de données",
|
||||
"created_at": "2026-04-22T09:09:05+00:00",
|
||||
"use_count": 0
|
||||
},
|
||||
{
|
||||
"id": "f40cc578b50d",
|
||||
"topic": "SCHEMA SAP",
|
||||
"kind": "flowchart",
|
||||
"context": "Auto-generated from user query",
|
||||
"code": "graph LR\n Client-->|Demande d'achat|Acheteur\n Acheteur-->|Place une commande|SAP\n SAP-->|Traite la commande|SAP\n SAP-->|Vérifie la disponibilité|Magasin\n Magasin-->|Vérifie la disponibilité|SAP\n SAP-->|Envoie la commande|Transporteur\n Transporteur-->|Livraison|Client\n Client-->|Paiement|SAP\n SAP-->|Enregistre la transaction|SAP\n SAP-->|Mise à jour du stock|Magasin\n Magasin-->|Mise à jour du stock|SAP\n SAP-->|Génère un rapport|SAP",
|
||||
"created_at": "2026-04-22T13:18:17+00:00",
|
||||
"use_count": 0
|
||||
},
|
||||
{
|
||||
"id": "358fc5958f31",
|
||||
"topic": "test",
|
||||
"kind": "flowchart",
|
||||
"context": "Auto-generated from user query",
|
||||
"code": "flowchart LR\n A[Init] --> B[Calcul]\n B --> C[Affichage]\n C --> D[Fin]\n D --> E[Sortie]\n E --> F[Réinitialisation]\n F --> A",
|
||||
"created_at": "2026-04-22T13:55:05+00:00",
|
||||
"use_count": 0
|
||||
}
|
||||
]
|
||||
BIN
generated/wevia-ANTHROPIC-20260422-132328-ad0056.docx
Normal file
84
generated/wevia-ANTHROPIC-20260422-132328-ad0056.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# ANTHROPIC
|
||||
|
||||
**Document Word : L'Anthropocène**
|
||||
|
||||
**Titre**
|
||||
|
||||
L'Anthropocène : un nouveau paradigme pour notre planète
|
||||
|
||||
**Sommaire**
|
||||
|
||||
1. [Introduction](#introduction)
|
||||
2. [Définition et caractéristiques de l'Anthropocène](#anthropocène)
|
||||
3. [Impacts de l'Anthropocène sur l'environnement](#impacts)
|
||||
4. [Conséquences de l'Anthropocène pour l'humanité](#conséquences)
|
||||
5. [Solutions pour atténuer les impacts de l'Anthropocène](#solutions)
|
||||
6. [Conclusion](#conclusion)
|
||||
|
||||
**1. Introduction**
|
||||
|
||||
L'Anthropocène est un concept qui a été proposé pour décrire la période de l'histoire de la Terre où l'activité humaine a un impact significatif sur l'environnement. Ce concept a été introduit en 2000 par le géologue Paul Crutzen et a depuis été largement discuté dans la communauté scientifique.
|
||||
|
||||
**2. Définition et caractéristiques de l'Anthropocène**
|
||||
|
||||
L'Anthropocène est caractérisé par une série d'activités humaines qui ont un impact significatif sur l'environnement, notamment :
|
||||
|
||||
* L'utilisation de sources d'énergie fossile
|
||||
* La déforestation et la destruction des écosystèmes
|
||||
* La pollution de l'air, de l'eau et du sol
|
||||
* La modification des cycles biogéochimiques
|
||||
* La destruction des espèces et la perte de biodiversité
|
||||
|
||||
**3. Impacts de l'Anthropocène sur l'environnement**
|
||||
|
||||
Les impacts de l'Anthropocène sur l'environnement sont nombreux et graves, notamment :
|
||||
|
||||
* Le réchauffement climatique
|
||||
* La pollution de l'air et de l'eau
|
||||
* La perte de biodiversité
|
||||
* La dégradation des sols
|
||||
* La modification des cycles biogéochimiques
|
||||
|
||||
**4. Conséquences de l'Anthropocène pour l'humanité**
|
||||
|
||||
Les conséquences de l'Anthropocène pour l'humanité sont également graves, notamment :
|
||||
|
||||
* Les changements climatiques
|
||||
* Les catastrophes naturelles
|
||||
* Les maladies et les épidémies
|
||||
* La perte de ressources naturelles
|
||||
* La dégradation de la qualité de vie
|
||||
|
||||
**5. Solutions pour atténuer les impacts de l'Anthropocène**
|
||||
|
||||
Il existe plusieurs solutions pour atténuer les impacts de l'Anthropocène, notamment :
|
||||
|
||||
* La transition énergétique vers des sources d'énergie renouvelables
|
||||
* La protection et la restauration des écosystèmes
|
||||
* La réduction de la pollution de l'air et de l'eau
|
||||
* La promotion de la biodiversité et de la conservation des espèces
|
||||
* La mise en place de politiques et de lois pour protéger l'environnement
|
||||
|
||||
**6. Conclusion**
|
||||
|
||||
L'Anthropocène est un concept qui met en évidence l'impact significatif de l'activité humaine sur l'environnement. Il est essentiel que nous prenions des mesures pour atténuer les impacts de l'Anthropocène et protéger l'environnement pour assurer un avenir durable pour l'humanité.
|
||||
|
||||
**Annexe**
|
||||
|
||||
* Liste des références bibliographiques
|
||||
* Liste des sources de données utilisées
|
||||
* Tableau des impacts de l'Anthropocène sur l'environnement
|
||||
|
||||
| Impact | Description |
|
||||
| --- | --- |
|
||||
| Réchauffement climatique | Augmentation de la température moyenne de la planète |
|
||||
| Pollution de l'air | Émission de gaz à effet de serre et de polluants |
|
||||
| Perte de biodiversité | Déclin des espèces et des écosystèmes |
|
||||
| Dégradation des sols | Perte de fertilité et de capacité de stockage de carbone |
|
||||
| Modification des cycles biogéochimiques | Changement des processus naturels de la Terre |
|
||||
|
||||
**Références**
|
||||
|
||||
* Crutzen, P. J. (2002). Geology of mankind. Nature, 415(6867), 23.
|
||||
* Steffen, W., et al. (2011). The Anthropocene: From Global Change to Planetary Stewardship. AMBIO: A Journal of the Human Environment, 40(7), 739-761.
|
||||
* Rockström, J., et al. (2009). A safe operating space for humanity. Nature, 461(7263), 472-475.
|
||||
@@ -0,0 +1,52 @@
|
||||
# BUSSINNES PLAN VITAMINE d POUR CNVAINCRE MON ASSOCIE
|
||||
|
||||
# Introduction
|
||||
* Présentation du projet Vitamin d pour CNVaincre mon associé
|
||||
* Objectif : développer un plan d'affaires pour booster les ventes et augmenter la visibilité de l'entreprise
|
||||
|
||||
# Analyse de marché
|
||||
* Cible : professionnels de la santé et particuliers souhaitant améliorer leur bien-être
|
||||
* Concurrence : nombreux acteurs sur le marché de la nutrition et du bien-être
|
||||
* Avantages concurrentiels : qualité des produits, expertise des équipes, engagement envers la durabilité
|
||||
|
||||
# Stratégie marketing
|
||||
* Positionnement : leader du marché de la nutrition pour la santé
|
||||
* Canaux de communication :
|
||||
+ Réseaux sociaux
|
||||
+ Publicité en ligne
|
||||
+ Partenariats avec des professionnels de la santé
|
||||
* Contenu de communication :
|
||||
+ Informations sur les bienfaits du Vitamin d
|
||||
+ Testimonials de clients satisfaits
|
||||
|
||||
# Produits et services
|
||||
* Gamme de produits Vitamin d :
|
||||
+ Comprimés
|
||||
+ Gélules
|
||||
+ Produits dérivés (crèmes, huiles, etc.)
|
||||
* Services :
|
||||
+ Conseil nutritionnel personnalisé
|
||||
+ Suivi de la santé et des progrès
|
||||
|
||||
# Plan d'action
|
||||
* Short-term (3-6 mois) :
|
||||
+ Lancement de la stratégie marketing
|
||||
+ Développement de la gamme de produits
|
||||
+ Établissement de partenariats avec des professionnels de la santé
|
||||
* Mid-term (6-12 mois) :
|
||||
+ Augmentation de la visibilité de l'entreprise
|
||||
+ Développement de la base de clients
|
||||
+ Amélioration de la qualité des produits et services
|
||||
* Long-term (1-2 ans) :
|
||||
+ Consolidation de la position de leader sur le marché
|
||||
+ Développement de nouveaux produits et services
|
||||
|
||||
# Budget et ressources
|
||||
* Estimation du budget nécessaire pour la mise en œuvre du plan d'affaires
|
||||
* Identification des ressources humaines et financières nécessaires pour atteindre les objectifs
|
||||
* Plan de suivi et d'évaluation des performances
|
||||
|
||||
# Conclusion
|
||||
* Résumé des principaux points du plan d'affaires
|
||||
* Appel à l'action pour les parties prenantes
|
||||
* Engagement envers la réussite du projet
|
||||
BIN
generated/wevia-COMPTABILITE-WEVAL-20260422-132258-c5e40c.docx
Normal file
66
generated/wevia-COMPTABILITE-WEVAL-20260422-132258-c5e40c.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# COMPTABILITE WEVAL
|
||||
|
||||
**COMPTABILITE WEVAL**
|
||||
=====================
|
||||
|
||||
**Sommaire**
|
||||
------------
|
||||
|
||||
1. [Introduction](#introduction)
|
||||
2. [Définition de la comptabilité WEVAL](#définition-de-la-comptabilité-weval)
|
||||
3. [Avantages de la comptabilité WEVAL](#avantages-de-la-comptabilité-weval)
|
||||
4. [Contrôle interne et assurance de la qualité](#contrôle-interne-et-assurance-de-la-qualité)
|
||||
5. [Exemple de mise en œuvre de la comptabilité WEVAL](#exemple-de-mise-en-œuvre-de-la-comptabilité-weval)
|
||||
6. [Conclusion](#conclusion)
|
||||
|
||||
**Introduction**
|
||||
---------------
|
||||
|
||||
La comptabilité WEVAL est un système de comptabilité qui s'appuie sur des règles et des normes internationales pour garantir l'exactitude et la fiabilité des informations comptables. Cette approche est essentielle pour les entreprises qui souhaitent afficher une image transparente et responsable de leur situation financière.
|
||||
|
||||
**Définition de la comptabilité WEVAL**
|
||||
-------------------------------------
|
||||
|
||||
La comptabilité WEVAL est un système de comptabilité qui s'appuie sur les normes internationales de comptabilité (IASC) et les principes comptables généralement acceptés (GAAP). Ce système vise à garantir la fiabilité et l'exactitude des informations comptables en mettant en place des contrôles internes et des procédures de vérification.
|
||||
|
||||
**Avantages de la comptabilité WEVAL**
|
||||
--------------------------------------
|
||||
|
||||
Les avantages de la comptabilité WEVAL sont nombreux :
|
||||
|
||||
* **Transparence financière** : Les informations comptables sont présentées de manière claire et précise, ce qui permet aux investisseurs et aux actionnaires de prendre des décisions éclairées.
|
||||
* **Responsabilité** : La comptabilité WEVAL encourage la responsabilité et la transparence dans les pratiques comptables, ce qui est essentiel pour maintenir la confiance des parties prenantes.
|
||||
* **Comparabilité** : Les informations comptables sont présentées selon les mêmes normes et principes, ce qui facilite la comparaison entre les entreprises.
|
||||
|
||||
**Contrôle interne et assurance de la qualité**
|
||||
---------------------------------------------
|
||||
|
||||
Pour garantir la fiabilité et l'exactitude des informations comptables, les entreprises doivent mettre en place un système de contrôle interne et de vérification. Ce système doit inclure :
|
||||
|
||||
* **Contrôle des processus** : Les processus comptables doivent être contrôlés pour garantir qu'ils sont suivis correctement.
|
||||
* **Vérification des données** : Les données comptables doivent être vérifiées pour garantir qu'elles sont exactes et précises.
|
||||
* **Audit** : Les comptes doivent être audités régulièrement pour garantir qu'ils sont présentés de manière correcte.
|
||||
|
||||
**Exemple de mise en œuvre de la comptabilité WEVAL**
|
||||
---------------------------------------------------
|
||||
|
||||
Voici un exemple de mise en œuvre de la comptabilité WEVAL dans une entreprise :
|
||||
|
||||
| **Étape** | **Description** |
|
||||
| --- | --- |
|
||||
| 1 | Mise en place d'un système de comptabilité WEVAL |
|
||||
| 2 | Formation des employés sur les normes et principes comptables |
|
||||
| 3 | Mise en place de contrôles internes et de procédures de vérification |
|
||||
| 4 | Vérification des données comptables |
|
||||
| 5 | Audit des comptes |
|
||||
|
||||
**Conclusion**
|
||||
--------------
|
||||
|
||||
La comptabilité WEVAL est un système de comptabilité qui garantit la fiabilité et l'exactitude des informations comptables. Les avantages de cette approche sont nombreux, notamment la transparence financière, la responsabilité et la comparabilité. Pour mettre en œuvre la comptabilité WEVAL, les entreprises doivent mettre en place un système de contrôle interne et de vérification. Enfin, voici quelques conseils pratiques pour mettre en œuvre la comptabilité WEVAL :
|
||||
|
||||
* **Mise en place d'un système de comptabilité WEVAL** : Les entreprises doivent mettre en place un système de comptabilité WEVAL qui inclut les normes et principes comptables internationaux.
|
||||
* **Formation des employés** : Les employés doivent être formés sur les normes et principes comptables pour garantir qu'ils comprennent les exigences de la comptabilité WEVAL.
|
||||
* **Mise en place de contrôles internes** : Les entreprises doivent mettre en place des contrôles internes pour garantir que les processus comptables sont suivis correctement.
|
||||
* **Vérification des données** : Les données comptables doivent être vérifiées pour garantir qu'elles sont exactes et précises.
|
||||
* **Audit** : Les comptes doivent être audités régulièrement pour garantir qu'ils sont présentés de manière correcte.
|
||||
@@ -0,0 +1,40 @@
|
||||
# POUR BUSSINNESS PLAN VITAMINE d POUR CONVAINCRE MON ASSOCIE
|
||||
|
||||
# Introduction
|
||||
|
||||
* Présentation du concept de Vitamin d
|
||||
* Importance de la vitamin d pour la santé
|
||||
* Objectif : convaincre mon associé de l'importance de Vitamin d pour le business plan
|
||||
|
||||
# Qu'est-ce que la Vitamin d ?
|
||||
|
||||
* Substance chimique naturelle produite par le corps humain en réponse à l'exposition à la lumière du soleil
|
||||
* Rôle clé dans la régulation du calcium et de la densité osseuse
|
||||
* Importance pour la santé générale et la prévention de maladies
|
||||
|
||||
# Avantages pour le business plan
|
||||
|
||||
* Augmentation de la productivité et de la motivation des employés
|
||||
* Amélioration de la santé et de la bien-être des employés
|
||||
* Réduction des coûts liés à la maladie et à l'absentéisme
|
||||
* Amélioration de l'image de marque et de la réputation de l'entreprise
|
||||
|
||||
# Comment obtenir la Vitamin d ?
|
||||
|
||||
* Exposition au soleil (environ 15-30 minutes par jour)
|
||||
* Alimentation (produits laitiers, poissons gras, etc.)
|
||||
* Suppléments alimentaires (sous forme de poudre ou de gélules)
|
||||
* Précautions : éviter l'exposition excessive au soleil, ne pas prendre de suppléments sans consultation médicale
|
||||
|
||||
# Stratégie de communication
|
||||
|
||||
* Sensibiliser les employés à l'importance de la Vitamin d
|
||||
* Proposer des solutions pour améliorer la santé et le bien-être des employés
|
||||
* Encourager les employés à adopter des habitudes saines
|
||||
* Suivre les progrès et ajuster la stratégie en conséquence
|
||||
|
||||
# Conclusion
|
||||
|
||||
* La Vitamin d est essentielle pour la santé et la productivité des employés
|
||||
* Une stratégie de communication claire et efficace peut aider à convaincre mon associé de l'importance de Vitamin d pour le business plan
|
||||
* Ensemble, nous pouvons créer un environnement de travail sain et productif.
|
||||
41
generated/wevia-SAP-20260422-131605-f23eb2.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# SAP
|
||||
|
||||
# Introduction à SAP
|
||||
|
||||
SAP (Systems, Applications and Products in Data Processing) est un logiciel de gestion de l'information développé par la société allemande SAP SE. Créé en 1972, SAP est l'un des logiciels de gestion de l'information les plus largement utilisés dans le monde.
|
||||
|
||||
## Histoire de SAP
|
||||
|
||||
* Fondation de SAP en 1972 par Dietmar Hopp, Hasso Plattner, Claus Wellenreuther et Klaus Tschira
|
||||
* Lancement du premier produit SAP R/1 en 1972
|
||||
* Développement de SAP R/2 en 1979
|
||||
* Lancement de SAP R/3 en 1992, qui marque le début de la popularité de SAP
|
||||
* SAP devient une entreprise cotée en bourse en 1988
|
||||
|
||||
## Fonctionnalités de SAP
|
||||
|
||||
* Gestion des ressources humaines (RH)
|
||||
* Gestion financière (comptabilité, gestion des flux de trésorerie)
|
||||
* Gestion des ventes et des achats
|
||||
* Gestion de la production et des stocks
|
||||
* Gestion des relations avec les clients et les fournisseurs
|
||||
* Analyse de données et reporting
|
||||
|
||||
## Avantages de l'utilisation de SAP
|
||||
|
||||
* Amélioration de l'efficacité et de la productivité
|
||||
* Meilleure visibilité et contrôle des activités de l'entreprise
|
||||
* Capacité à prendre des décisions éclairées grâce à l'analyse de données
|
||||
* Intégration des systèmes et des processus
|
||||
* Sécurité et conformité aux normes réglementaires
|
||||
|
||||
## Exemples d'utilisation de SAP
|
||||
|
||||
* Sociétés de grande taille (multinationales)
|
||||
* Entreprises de services (banques, assurances)
|
||||
* Entreprises de production (industrie manufacturière)
|
||||
* Petites et moyennes entreprises (PME)
|
||||
|
||||
# Conclusion
|
||||
|
||||
SAP est un logiciel de gestion de l'information puissant et flexible qui peut répondre aux besoins de nombreuses entreprises. Avec ses nombreuses fonctionnalités et son intégration des systèmes et des processus, SAP peut aider les entreprises à améliorer leur efficacité et leur productivité, ainsi qu'à prendre des décisions éclairées grâce à l'analyse de données.
|
||||
BIN
generated/wevia-SAP-20260422-131605-f23eb2.pdf
Normal file
43
generated/wevia-SAP-20260422-132222-d4a32e.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# SAP
|
||||
|
||||
# Présentation de SAP
|
||||
|
||||
* SAP est un leader mondial dans les solutions de gestion d'entreprise
|
||||
* Fondée en 1972 en Allemagne
|
||||
* Siège social à Walldorf, Allemagne
|
||||
* Chiffre d'affaires : 28,7 milliards d'euros en 2022
|
||||
|
||||
# Avantages de SAP
|
||||
|
||||
* Intégration des processus métier
|
||||
* Amélioration de la productivité et de la rentabilité
|
||||
* Meilleure prise de décision grâce à des données fiables
|
||||
* Sécurité et conformité aux normes
|
||||
|
||||
# Solutions SAP
|
||||
|
||||
* SAP ERP (Système d'exploitation de ressources)
|
||||
* SAP S/4HANA (Système d'exploitation de ressources 4 HANA)
|
||||
* SAP CRM (Gestion de la relation client)
|
||||
* SAP SCM (Gestion de la chaîne d'approvisionnement)
|
||||
* SAP HCM (Gestion des ressources humaines)
|
||||
|
||||
# Carrières chez SAP
|
||||
|
||||
* Plus de 100 000 employés dans le monde
|
||||
* 190 pays représentés
|
||||
* Opportunités de carrière variées (développeur, consultant, formateur, etc.)
|
||||
* Politique de diversité et d'inclusion
|
||||
|
||||
# Partenaires et certifications
|
||||
|
||||
* Partenaires stratégiques (Microsoft, IBM, etc.)
|
||||
* Certifications (SAP Certified Associate, SAP Certified Professional, etc.)
|
||||
* Programme de partenariat pour les PME (Petites et moyennes entreprises)
|
||||
|
||||
# Cas d'utilisation de SAP
|
||||
|
||||
* Gestion de la chaîne d'approvisionnement pour les entreprises de grande taille
|
||||
* Amélioration de la productivité pour les PME
|
||||
* Gestion de la relation client pour les entreprises de services
|
||||
* Gestion des ressources humaines pour les administrations publiques
|
||||
BIN
generated/wevia-SAP-20260422-132222-d4a32e.pptx
Normal file
30
generated/wevia-SAP-S4HANA-20260422-092036-e09d04.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# SAP S4HANA
|
||||
|
||||
# SAP S4HANA : Une Plateforme de Gestion de la Chaîne d'Approvisionnement Intégrée
|
||||
|
||||
## Introduction
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de la chaîne d'approvisionnement intégrée développée par SAP SE. Elle constitue une évolution majeure de la plateforme SAP ERP, offrant une expérience utilisateur améliorée, une flexibilité accrue et des fonctionnalités innovantes pour les entreprises du XXIe siècle.
|
||||
|
||||
## Avantages Clés
|
||||
|
||||
* **Intégration de la chaîne d'approvisionnement** : SAP S4HANA permet une gestion intégrée de la chaîne d'approvisionnement, des commandes clients aux livraisons, en passant par la gestion des stocks et la planification des produits.
|
||||
* **Flexibilité et personnalisation** : La plateforme offre une grande flexibilité et une personnalisation avancée, permettant aux entreprises de personnaliser les processus et les fonctionnalités pour répondre à leurs besoins spécifiques.
|
||||
* **Analytique et intelligence artificielle** : SAP S4HANA intègre des fonctionnalités d'analytique et d'intelligence artificielle pour aider les entreprises à prendre des décisions éclairées et à améliorer leur efficacité opérationnelle.
|
||||
* **Sécurité et conformité** : La plateforme garantit une sécurité et une conformité renforcées, avec des fonctionnalités de gestion des accès, des contrôles de données et des rapports de conformité.
|
||||
|
||||
## Fonctionnalités Principales
|
||||
|
||||
* **Gestion des commandes et des livraisons** : SAP S4HANA permet une gestion efficace des commandes clients et des livraisons, avec des fonctionnalités de suivi et de traçabilité.
|
||||
* **Gestion des stocks et des produits** : La plateforme offre des fonctionnalités de gestion des stocks et des produits, permettant aux entreprises de gérer leurs stocks, de planifier leurs produits et de prendre des décisions éclairées.
|
||||
* **Gestion des finances et des ressources humaines** : SAP S4HANA intègre des fonctionnalités de gestion des finances et des ressources humaines, permettant aux entreprises de gérer leurs finances, de gérer leurs ressources humaines et de prendre des décisions éclairées.
|
||||
|
||||
## Avantages pour les Entreprises
|
||||
|
||||
* **Amélioration de l'efficacité opérationnelle** : SAP S4HANA permet aux entreprises d'améliorer leur efficacité opérationnelle, en réduisant les coûts, en améliorant la qualité des produits et en augmentant la satisfaction des clients.
|
||||
* **Amélioration de la prise de décision** : La plateforme offre des fonctionnalités d'analytique et d'intelligence artificielle, permettant aux entreprises de prendre des décisions éclairées et de prendre des décisions plus rapides.
|
||||
* **Amélioration de la conformité** : SAP S4HANA garantit une sécurité et une conformité renforcées, avec des fonctionnalités de gestion des accès, des contrôles de données et des rapports de conformité.
|
||||
|
||||
## Conclusion
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de la chaîne d'approvisionnement intégrée développée par SAP SE. Elle offre une expérience utilisateur améliorée, une flexibilité accrue et des fonctionnalités innovantes pour les entreprises du XXIe siècle. Les avantages clés de la plateforme incluent l'intégration de la chaîne d'approvisionnement, la flexibilité et la personnalisation, l'analytique et l'intelligence artificielle, et la sécurité et la conformité. Les fonctionnalités principales de la plateforme incluent la gestion des commandes et des livraisons, la gestion des stocks et des produits, et la gestion des finances et des ressources humaines. Les avantages pour les entreprises incluent l'amélioration de l'efficacité opérationnelle, l'amélioration de la prise de décision, et l'amélioration de la conformité.
|
||||
BIN
generated/wevia-SAP-S4HANA-20260422-092036-e09d04.pdf
Normal file
56
generated/wevia-SAP-S4HANA-20260422-092211-db1bb1.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# SAP S4HANA
|
||||
|
||||
# SAP S4HANA : Une Plateforme de Gestion de l'Entreprise Intégrée
|
||||
======================================================
|
||||
|
||||
## Introduction
|
||||
---------------
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de l'entreprise intégrée conçue pour aider les entreprises à gérer leurs activités de manière efficace et efficace. Elle est développée par SAP, l'un des leaders mondiaux dans le domaine de la technologie de l'information.
|
||||
|
||||
### Avantages de SAP S4HANA
|
||||
|
||||
* Amélioration de la productivité grâce à une automatisation accrue des processus
|
||||
* Meilleure prise de décision grâce à des données actualisées et fiables
|
||||
* Réduction des coûts grâce à une optimisation des ressources
|
||||
* Amélioration de la collaboration entre les équipes et les partenaires
|
||||
|
||||
## Caractéristiques Clés
|
||||
------------------------
|
||||
|
||||
### Architecture
|
||||
|
||||
SAP S4HANA est basée sur une architecture modulaire, qui permet une flexibilité et une évolutivité accrues. Elle est composée de plusieurs composants, notamment :
|
||||
|
||||
* **SAP HANA**: une base de données en temps réel qui permet une gestion rapide et efficace des données
|
||||
* **SAP Fiori**: une interface utilisateur intuitive qui permet une navigation facile et une expérience utilisateur améliorée
|
||||
* **SAP Business Warehouse**: une solution de business intelligence qui permet une analyse et une prise de décision éclairées
|
||||
|
||||
### Fonctionnalités
|
||||
|
||||
SAP S4HANA offre une large gamme de fonctionnalités pour gérer les activités de l'entreprise, notamment :
|
||||
|
||||
* **Gestion des ressources humaines** : gestion des employés, des salaires, des avantages sociaux
|
||||
* **Gestion des finances** : gestion des comptes, des factures, des paiements
|
||||
* **Gestion des stocks** : gestion des stocks, des commandes, des livraisons
|
||||
* **Gestion de la production** : gestion des ordres de production, des stocks, des équipements
|
||||
|
||||
## Avantages pour les Entreprises
|
||||
---------------------------------
|
||||
|
||||
### Amélioration de la Productivité
|
||||
|
||||
SAP S4HANA permet une automatisation accrue des processus, ce qui permet de libérer du temps pour les employés et de les concentrer sur les tâches stratégiques.
|
||||
|
||||
### Meilleure Prise de Décision
|
||||
|
||||
SAP S4HANA fournit des données actualisées et fiables, ce qui permet de prendre des décisions éclairées et de réduire les risques.
|
||||
|
||||
### Réduction des Coûts
|
||||
|
||||
SAP S4HANA permet une optimisation des ressources, ce qui permet de réduire les coûts et de les allouer à des activités plus stratégiques.
|
||||
|
||||
## Conclusion
|
||||
----------
|
||||
|
||||
SAP S4HANA est une plateforme de gestion de l'entreprise intégrée qui offre une large gamme de fonctionnalités pour gérer les activités de l'entreprise. Elle permet une amélioration de la productivité, une meilleure prise de décision et une réduction des coûts. Les entreprises qui adoptent SAP S4HANA peuvent bénéficier d'une compétitivité accrue et de la capacité de répondre aux besoins de leurs clients de manière efficace.
|
||||
BIN
generated/wevia-SAP-S4HANA-20260422-092211-db1bb1.pdf
Normal file
@@ -0,0 +1,28 @@
|
||||
# SAP S4HANA benefices migration
|
||||
|
||||
# Migration vers SAP S/4HANA : Les avantages
|
||||
|
||||
## Introduction
|
||||
|
||||
La migration vers SAP S/4HANA est un processus crucial pour les entreprises qui souhaitent bénéficier des dernières technologies et des fonctionnalités innovantes de l'entreprise. Dans ce document, nous allons explorer les avantages de la migration vers SAP S/4HANA et comment elle peut aider les entreprises à améliorer leur performance et leur compétitivité.
|
||||
|
||||
## Avantages de la migration vers SAP S/4HANA
|
||||
|
||||
### Amélioration de la performance
|
||||
|
||||
* **Gain de productivité** : SAP S/4HANA est conçu pour être plus rapide et plus efficace que les anciennes versions de SAP, ce qui signifie que les utilisateurs peuvent travailler plus rapidement et avec plus de précision.
|
||||
* **Réduction des coûts** : La migration vers SAP S/4HANA peut aider les entreprises à réduire leurs coûts liés à la maintenance et à l'entretien de leurs systèmes actuels.
|
||||
|
||||
### Innovation et flexibilité
|
||||
|
||||
* **Fonctionnalités innovantes** : SAP S/4HANA offre une gamme de fonctionnalités innovantes qui peuvent aider les entreprises à améliorer leur processus d'affaires, tels que la gestion de la chaîne d'approvisionnement, la gestion des ressources humaines et la gestion financière.
|
||||
* **Intégration avec les technologies émergentes** : SAP S/4HANA est conçu pour être intégré avec les technologies émergentes, telles que l'intelligence artificielle, la réalité virtuelle et la blockchain.
|
||||
|
||||
### Sécurité et conformité
|
||||
|
||||
* **Sécurité renforcée** : SAP S/4HANA offre une sécurité renforcée pour protéger les données sensibles des entreprises.
|
||||
* **Conformité réglementaire** : SAP S/4HANA est conçu pour être conforme aux réglementations et aux normes internationales, telles que la GDPR et la SOX.
|
||||
|
||||
## Conclusion
|
||||
|
||||
La migration vers SAP S/4HANA est un processus crucial pour les entreprises qui souhaitent bénéficier des dernières technologies et des fonctionnalités innovantes de l'entreprise. Les avantages de la migration vers SAP S/4HANA comprennent l'amélioration de la performance, l'innovation et la flexibilité, ainsi que la sécurité et la conformité. En choisissant de migrer vers SAP S/4HANA, les entreprises peuvent améliorer leur performance et leur compétitivité, et se préparer à l'avenir.
|
||||
267
generated/wevia-code-SITE-ECOMMERCE-20260422-132141-dc46ea.py
Normal file
@@ -0,0 +1,267 @@
|
||||
# Importation des bibliothèques nécessaires
|
||||
from flask import Flask, render_template, request, redirect, url_for
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
# Création de l'application Flask
|
||||
app = Flask(__name__)
|
||||
|
||||
# Configuration de la base de données
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
# Modèle de la base de données
|
||||
class Produit(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
nom = db.Column(db.String(100), nullable=False)
|
||||
description = db.Column(db.String(200), nullable=False)
|
||||
prix = db.Column(db.Float, nullable=False)
|
||||
quantite = db.Column(db.Integer, nullable=False)
|
||||
|
||||
class Commande(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
produit_id = db.Column(db.Integer, db.ForeignKey('produit.id'), nullable=False)
|
||||
quantite = db.Column(db.Integer, nullable=False)
|
||||
|
||||
# Fonction pour afficher la liste des produits
|
||||
@app.route('/')
|
||||
def index():
|
||||
produits = Produit.query.all()
|
||||
return render_template('index.html', produits=produits)
|
||||
|
||||
# Fonction pour afficher le détail d'un produit
|
||||
@app.route('/produit/<int:id>')
|
||||
def produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
return render_template('produit.html', produit=produit)
|
||||
|
||||
# Fonction pour ajouter un produit
|
||||
@app.route('/ajouter_produit', methods=['GET', 'POST'])
|
||||
def ajouter_produit():
|
||||
if request.method == 'POST':
|
||||
nom = request.form['nom']
|
||||
description = request.form['description']
|
||||
prix = float(request.form['prix'])
|
||||
quantite = int(request.form['quantite'])
|
||||
produit = Produit(nom=nom, description=description, prix=prix, quantite=quantite)
|
||||
db.session.add(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('ajouter_produit.html')
|
||||
|
||||
# Fonction pour ajouter une commande
|
||||
@app.route('/ajouter_commande', methods=['GET', 'POST'])
|
||||
def ajouter_commande():
|
||||
if request.method == 'POST':
|
||||
produit_id = int(request.form['produit_id'])
|
||||
quantite = int(request.form['quantite'])
|
||||
commande = Commande(produit_id=produit_id, quantite=quantite)
|
||||
db.session.add(commande)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('ajouter_commande.html')
|
||||
|
||||
# Fonction pour afficher la liste des commandes
|
||||
@app.route('/commandes')
|
||||
def commandes():
|
||||
commandes = Commande.query.all()
|
||||
return render_template('commandes.html', commandes=commandes)
|
||||
|
||||
# Fonction pour supprimer un produit
|
||||
@app.route('/supprimer_produit/<int:id>')
|
||||
def supprimer_produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
db.session.delete(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
# Fonction pour supprimer une commande
|
||||
@app.route('/supprimer_commande/<int:id>')
|
||||
def supprimer_commande(id):
|
||||
commande = Commande.query.get(id)
|
||||
db.session.delete(commande)
|
||||
db.session.commit()
|
||||
return redirect(url_for('commandes'))
|
||||
|
||||
# Fonction pour afficher la page d'accueil
|
||||
@app.route('/accueil')
|
||||
def accueil():
|
||||
return render_template('accueil.html')
|
||||
|
||||
# Fonction pour afficher la page de contact
|
||||
@app.route('/contact')
|
||||
def contact():
|
||||
return render_template('contact.html')
|
||||
|
||||
# Fonction pour afficher la page de panier
|
||||
@app.route('/panier')
|
||||
def panier():
|
||||
return render_template('panier.html')
|
||||
|
||||
# Fonction pour afficher la page de paiement
|
||||
@app.route('/paiement')
|
||||
def paiement():
|
||||
return render_template('paiement.html')
|
||||
|
||||
# Fonction pour afficher la page de confirmation
|
||||
@app.route('/confirmation')
|
||||
def confirmation():
|
||||
return render_template('confirmation.html')
|
||||
|
||||
# Fonction pour afficher la page d'erreur
|
||||
@app.errorhandler(404)
|
||||
def page_not_found(e):
|
||||
return render_template('erreur.html'), 404
|
||||
|
||||
# Fonction pour lancer l'application
|
||||
if __name__ == '__main__':
|
||||
db.create_all()
|
||||
app.run(debug=True)
|
||||
|
||||
<!-- index.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Site E-commerce</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1> Liste des produits </h1>
|
||||
<ul>
|
||||
{% for produit in produits %}
|
||||
<li>
|
||||
{{ produit.nom }} - {{ produit.prix }}€
|
||||
<a href="{{ url_for('produit', id=produit.id) }}">Détails</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{{ url_for('ajouter_produit') }}">Ajouter un produit</a>
|
||||
<a href="{{ url_for('commandes') }}">Voir les commandes</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Détails du produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>{{ produit.nom }}</h1>
|
||||
<p>{{ produit.description }}</p>
|
||||
<p>Prix : {{ produit.prix }}€</p>
|
||||
<p>Quantité : {{ produit.quantite }}</p>
|
||||
<a href="{{ url_for('ajouter_commande', produit_id=produit.id) }}">Ajouter à la commande</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- ajouter_produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Ajouter un produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Ajouter un produit</h1>
|
||||
<form method="post">
|
||||
<label for="nom">Nom :</label>
|
||||
<input type="text" id="nom" name="nom"><br><br>
|
||||
<label for="description">Description :</label>
|
||||
<input type="text" id="description" name="description"><br><br>
|
||||
<label for="prix">Prix :</label>
|
||||
<input type="number" id="prix" name="prix"><br><br>
|
||||
<label for="quantite">Quantité :</label>
|
||||
<input type="number" id="quantite" name="quantite"><br><br>
|
||||
<input type="submit" value="Ajouter">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- ajouter_commande.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Ajouter une commande</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Ajouter une commande</h1>
|
||||
<form method="post">
|
||||
<label for="produit_id">Produit :</label>
|
||||
<select id="produit_id" name="produit_id">
|
||||
{% for produit in produits %}
|
||||
<option value="{{ produit.id }}">{{ produit.nom }}</option>
|
||||
{% endfor %}
|
||||
</select><br><br>
|
||||
<label for="quantite">Quantité :</label>
|
||||
<input type="number" id="quantite" name="quantite"><br><br>
|
||||
<input type="submit" value="Ajouter">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- commandes.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Commandes</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Commandes</h1>
|
||||
<ul>
|
||||
{% for commande in commandes %}
|
||||
<li>
|
||||
{{ commande.produit.nom }} - {{ commande.quantite }}
|
||||
<a href="{{ url_for('supprimer_commande', id=commande.id) }}">Supprimer</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- accueil.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Accueil</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Accueil</h1>
|
||||
<a href="{{ url_for('index') }}">Voir les produits</a>
|
||||
<a href="{{ url_for('commandes') }}">Voir les commandes</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- contact.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Contact</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Contact</h1>
|
||||
<p>Adresse : 123 rue de la République</p>
|
||||
<p>Téléphone : 01 23 45 67 89</p>
|
||||
<p>Email : contact@site-ecommerce.fr</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- panier.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Panier</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Panier</h1>
|
||||
<ul>
|
||||
{% for commande in commandes %}
|
||||
<li>
|
||||
{{ commande.produit.nom }} - {{ commande.quantite }}
|
||||
<a href="{{ url_for('supprimer_commande', id=commande.id) }}">Supprimer</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{{ url_for('paiement') }}">Payer</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- paiement.html -->
|
||||
<!DOCTYPE html>
|
||||
219
generated/wevia-code-site-commerce-20260422-092946-199ba8.py
Normal file
@@ -0,0 +1,219 @@
|
||||
# Importation des bibliothèques nécessaires
|
||||
from flask import Flask, render_template, request, redirect, url_for
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user, current_user
|
||||
from werkzeug.security import generate_password_hash, check_password_hash
|
||||
|
||||
# Création de l'application Flask
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = 'secret_key'
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
# Configuration de la base de données
|
||||
class User(UserMixin, db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
username = db.Column(db.String(20), unique=True, nullable=False)
|
||||
email = db.Column(db.String(120), unique=True, nullable=False)
|
||||
password = db.Column(db.String(60), nullable=False)
|
||||
|
||||
class Produit(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
nom = db.Column(db.String(100), nullable=False)
|
||||
description = db.Column(db.Text, nullable=False)
|
||||
prix = db.Column(db.Float, nullable=False)
|
||||
|
||||
# Configuration de la gestion des sessions
|
||||
login_manager = LoginManager(app)
|
||||
login_manager.login_view = 'login'
|
||||
|
||||
# Fonction pour récupérer l'utilisateur connecté
|
||||
@login_manager.user_loader
|
||||
def load_user(user_id):
|
||||
return User.query.get(int(user_id))
|
||||
|
||||
# Route pour la page d'accueil
|
||||
@app.route('/')
|
||||
def index():
|
||||
produits = Produit.query.all()
|
||||
return render_template('index.html', produits=produits)
|
||||
|
||||
# Route pour la page de connexion
|
||||
@app.route('/login', methods=['GET', 'POST'])
|
||||
def login():
|
||||
if request.method == 'POST':
|
||||
username = request.form['username']
|
||||
password = request.form['password']
|
||||
user = User.query.filter_by(username=username).first()
|
||||
if user and check_password_hash(user.password, password):
|
||||
login_user(user)
|
||||
return redirect(url_for('index'))
|
||||
return render_template('login.html')
|
||||
|
||||
# Route pour la page de déconnexion
|
||||
@app.route('/logout')
|
||||
@login_required
|
||||
def logout():
|
||||
logout_user()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
# Route pour la page de création de compte
|
||||
@app.route('/register', methods=['GET', 'POST'])
|
||||
def register():
|
||||
if request.method == 'POST':
|
||||
username = request.form['username']
|
||||
email = request.form['email']
|
||||
password = request.form['password']
|
||||
user = User(username=username, email=email, password=generate_password_hash(password))
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
return redirect(url_for('login'))
|
||||
return render_template('register.html')
|
||||
|
||||
# Route pour la page de création de produit
|
||||
@app.route('/produit', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def produit():
|
||||
if request.method == 'POST':
|
||||
nom = request.form['nom']
|
||||
description = request.form['description']
|
||||
prix = request.form['prix']
|
||||
produit = Produit(nom=nom, description=description, prix=prix)
|
||||
db.session.add(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('produit.html')
|
||||
|
||||
# Route pour la page de modification de produit
|
||||
@app.route('/produit/<int:id>', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def modifier_produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
if request.method == 'POST':
|
||||
produit.nom = request.form['nom']
|
||||
produit.description = request.form['description']
|
||||
produit.prix = request.form['prix']
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
return render_template('modifier_produit.html', produit=produit)
|
||||
|
||||
# Route pour la page de suppression de produit
|
||||
@app.route('/produit/<int:id>/supprimer', methods=['POST'])
|
||||
@login_required
|
||||
def supprimer_produit(id):
|
||||
produit = Produit.query.get(id)
|
||||
db.session.delete(produit)
|
||||
db.session.commit()
|
||||
return redirect(url_for('index'))
|
||||
|
||||
# Lancement de l'application
|
||||
if __name__ == '__main__':
|
||||
db.create_all()
|
||||
app.run(debug=True)
|
||||
|
||||
<!-- index.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Site de commerce</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Accueil</h1>
|
||||
<ul>
|
||||
{% for produit in produits %}
|
||||
<li>{{ produit.nom }} - {{ produit.prix }}€</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{{ url_for('produit') }}">Créer un produit</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- login.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Connexion</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Connexion</h1>
|
||||
<form method="POST">
|
||||
<label for="username">Nom d'utilisateur :</label>
|
||||
<input type="text" id="username" name="username"><br><br>
|
||||
<label for="password">Mot de passe :</label>
|
||||
<input type="password" id="password" name="password"><br><br>
|
||||
<input type="submit" value="Se connecter">
|
||||
</form>
|
||||
<a href="{{ url_for('register') }}">Créer un compte</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- register.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Inscription</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Inscription</h1>
|
||||
<form method="POST">
|
||||
<label for="username">Nom d'utilisateur :</label>
|
||||
<input type="text" id="username" name="username"><br><br>
|
||||
<label for="email">Adresse e-mail :</label>
|
||||
<input type="email" id="email" name="email"><br><br>
|
||||
<label for="password">Mot de passe :</label>
|
||||
<input type="password" id="password" name="password"><br><br>
|
||||
<input type="submit" value="S'inscrire">
|
||||
</form>
|
||||
<a href="{{ url_for('login') }}">Se connecter</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Créer un produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Créer un produit</h1>
|
||||
<form method="POST">
|
||||
<label for="nom">Nom du produit :</label>
|
||||
<input type="text" id="nom" name="nom"><br><br>
|
||||
<label for="description">Description du produit :</label>
|
||||
<textarea id="description" name="description"></textarea><br><br>
|
||||
<label for="prix">Prix du produit :</label>
|
||||
<input type="number" id="prix" name="prix"><br><br>
|
||||
<input type="submit" value="Créer le produit">
|
||||
</form>
|
||||
<a href="{{ url_for('index') }}">Retour à l'accueil</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- modifier_produit.html -->
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Modifier un produit</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Modifier un produit</h1>
|
||||
<form method="POST">
|
||||
<label for="nom">Nom du produit :</label>
|
||||
<input type="text" id="nom" name="nom" value="{{ produit.nom }}"><br><br>
|
||||
<label for="description">Description du produit :</label>
|
||||
<textarea id="description" name="description">{{ produit.description }}</textarea><br><br>
|
||||
<label for="prix">Prix du produit :</label>
|
||||
<input type="number" id="prix" name="prix" value="{{ produit.prix }}"><br><br>
|
||||
<input type="submit" value="Modifier le produit">
|
||||
</form>
|
||||
<a href="{{ url_for('index') }}">Retour à l'accueil</a>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Ce code crée un site de commerce avec les fonctionnalités suivantes :
|
||||
|
||||
* Connexion et inscription des utilisateurs
|
||||
* Création, modification et suppression de produits
|
||||
* Affichage de la liste des produits sur la page d'accueil
|
||||
|
||||
Le code utilise la bibliothèque Flask pour créer l'application web et la bibliothèque SQLAlchemy pour gérer la base de données. Les templates HTML sont utilisés pour afficher les pages de l'application.
|
||||
@@ -0,0 +1,31 @@
|
||||
import tkinter as tk
|
||||
|
||||
class Counter:
|
||||
def __init__(self):
|
||||
self.value = 0
|
||||
self.root = tk.Tk()
|
||||
self.root.title("Compteur")
|
||||
|
||||
self.label = tk.Label(self.root, text="0", font=("Helvetica", 24))
|
||||
self.label.pack()
|
||||
|
||||
self.button_decrement = tk.Button(self.root, text="-", command=self.decrement)
|
||||
self.button_decrement.pack(side=tk.LEFT)
|
||||
|
||||
self.button_increment = tk.Button(self.root, text="+", command=self.increment)
|
||||
self.button_increment.pack(side=tk.RIGHT)
|
||||
|
||||
def increment(self):
|
||||
self.value += 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
def decrement(self):
|
||||
self.value -= 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
def run(self):
|
||||
self.root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
counter = Counter()
|
||||
counter.run()
|
||||
@@ -0,0 +1,28 @@
|
||||
import tkinter as tk
|
||||
|
||||
class Counter:
|
||||
def __init__(self, master):
|
||||
self.master = master
|
||||
self.value = 0
|
||||
|
||||
self.label = tk.Label(master, text="0")
|
||||
self.label.pack()
|
||||
|
||||
self.button_plus = tk.Button(master, text="+", command=self.increment)
|
||||
self.button_plus.pack(side=tk.LEFT)
|
||||
|
||||
self.button_minus = tk.Button(master, text="-", command=self.decrement)
|
||||
self.button_minus.pack(side=tk.LEFT)
|
||||
|
||||
def increment(self):
|
||||
self.value += 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
def decrement(self):
|
||||
if self.value > 0:
|
||||
self.value -= 1
|
||||
self.label.config(text=str(self.value))
|
||||
|
||||
root = tk.Tk()
|
||||
counter = Counter(root)
|
||||
root.mainloop()
|
||||
@@ -0,0 +1,80 @@
|
||||
# genere moi un bussiness plan pour convaincre mon associe pou
|
||||
|
||||
# Plan d'Affaires pour la Vente de Vitamine D Naturelle au Maroc
|
||||
|
||||
## Présentation
|
||||
|
||||
### Introduction
|
||||
|
||||
Nous proposons un plan d'affaires pour la vente de vitamine D naturelle au Maroc, destinée aux enfants. Notre produit est fabriqué à partir de vitamine D naturelle issue du lichen et d'huile olive marocaine bio. Ce produit répond à la demande croissante de produits naturels et bio au Maroc.
|
||||
|
||||
### Objectifs
|
||||
|
||||
* Développer un produit unique et naturel pour répondre à la demande de vitamine D chez les enfants au Maroc
|
||||
* Créer un marché pour notre produit et atteindre un chiffre d'affaires de 500 000 DH dans les 12 premiers mois
|
||||
* Établir des partenariats avec des distributeurs et des pharmacies pour une large diffusion de notre produit
|
||||
|
||||
## Analyse du Marché
|
||||
|
||||
### Tendances du Marché
|
||||
|
||||
* La demande de produits naturels et bio augmente en permanence au Maroc
|
||||
* La vitamine D est essentielle pour la santé des enfants, notamment pour prévenir les carences en vitamine D
|
||||
* Le marché marocain de la vitamine D est en croissance, avec une demande croissante de produits naturels et bio
|
||||
|
||||
### Cible de Marché
|
||||
|
||||
* Enfants de 0 à 18 ans
|
||||
* Parents qui cherchent des produits naturels et bio pour leur enfants
|
||||
* Distributeurs et pharmacies qui cherchent des produits de qualité pour répondre à la demande de leurs clients
|
||||
|
||||
## Produit
|
||||
|
||||
### Composition
|
||||
|
||||
* Vitamine D naturelle issue du lichen
|
||||
* Huile olive marocaine bio
|
||||
* Aucun additif ni conservateur artificiel
|
||||
|
||||
### Avantages
|
||||
|
||||
* Produit naturel et bio
|
||||
* Riche en vitamine D essentielle pour la santé des enfants
|
||||
* Fabrication locale pour une qualité et une sécurité maximales
|
||||
|
||||
## Stratégie de Marketing
|
||||
|
||||
### Positionnement
|
||||
|
||||
* Produit unique et naturel pour répondre à la demande de vitamine D chez les enfants au Maroc
|
||||
* Marque de confiance pour les parents qui cherchent des produits de qualité pour leur enfants
|
||||
|
||||
### Canaux de Distribution
|
||||
|
||||
* Pharmacies
|
||||
* Distributeurs
|
||||
* Vente en ligne
|
||||
|
||||
### Communication
|
||||
|
||||
* Campagnes publicitaires ciblées pour les parents et les distributeurs
|
||||
* Partenariats avec des associations de santé et de bien-être pour promouvoir notre produit
|
||||
|
||||
## Plan Financier
|
||||
|
||||
### Budget
|
||||
|
||||
* Développement du produit et de la marque : 100 000 DH
|
||||
* Marketing et publicité : 150 000 DH
|
||||
* Distribution et vente : 250 000 DH
|
||||
* Total : 500 000 DH
|
||||
|
||||
### Projections de Chiffre d'Affaires
|
||||
|
||||
* 12 premiers mois : 500 000 DH
|
||||
* 24 premiers mois : 1 000 000 DH
|
||||
* 36 premiers mois : 1 500 000 DH
|
||||
|
||||
## Conclusion
|
||||
|
||||
Notre plan d'affaires propose un produit unique et naturel pour répondre à la demande de vitamine D chez les enfants au Maroc. Avec un budget de 500 000 DH, nous projetons atteindre un chiffre d'affaires de 500 000 DH dans les 12 premiers mois et de 1 500 000 DH dans les 36 premiers mois. Nous sommes convaincus que notre produit répondra à la demande croissante de produits naturels et bio au Maroc et que nous pouvons atteindre notre objectif de réussite.
|
||||
@@ -0,0 +1,18 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="0" y="0" width="400" height="300" fill="#f7f7f7" rx="10"/>
|
||||
<rect x="20" y="20" width="360" height="260" fill="#e5e5ea" rx="10"/>
|
||||
<rect x="40" y="40" width="320" height="220" fill="#cccccc" rx="10"/>
|
||||
<rect x="60" y="60" width="280" height="180" fill="#b3b3b3" rx="10"/>
|
||||
<rect x="80" y="80" width="240" height="140" fill="#999999" rx="10"/>
|
||||
<rect x="100" y="100" width="200" height="100" fill="#808080" rx="10"/>
|
||||
<rect x="120" y="120" width="160" height="60" fill="#666666" rx="10"/>
|
||||
<rect x="140" y="140" width="120" height="40" fill="#444444" rx="10"/>
|
||||
<rect x="160" y="160" width="80" height="20" fill="#222222" rx="10"/>
|
||||
<circle cx="200" cy="150" r="40" fill="#03a9f4" stroke="#03a9f4" stroke-width="2"/>
|
||||
<circle cx="220" cy="170" r="30" fill="#03a9f4" stroke="#03a9f4" stroke-width="2"/>
|
||||
<circle cx="240" cy="190" r="20" fill="#03a9f4" stroke="#03a9f4" stroke-width="2"/>
|
||||
<text x="180" y="130" font-size="24" font-family="Arial" fill="#ffffff">Dashboard</text>
|
||||
<line x1="180" y1="160" x2="280" y2="160" stroke="#03a9f4" stroke-width="2"/>
|
||||
<line x1="180" y1="180" x2="280" y2="180" stroke="#03a9f4" stroke-width="2"/>
|
||||
<line x1="180" y1="200" x2="280" y2="200" stroke="#03a9f4" stroke-width="2"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="0" y="0" width="400" height="300" fill="#f0f0f0" rx="10"/>
|
||||
<rect x="20" y="20" width="360" height="260" fill="#4567b7" rx="10"/>
|
||||
<ellipse cx="200" cy="150" rx="120" ry="80" fill="#4567b7"/>
|
||||
<rect x="100" y="100" width="200" height="100" fill="#4567b7" rx="10"/>
|
||||
<rect x="100" y="220" width="200" height="50" fill="#4567b7" rx="10"/>
|
||||
<text x="20" y="30" font-size="24" font-family="Arial, sans-serif" fill="#fff">Dashboard</text>
|
||||
<text x="20" y="60" font-size="18" font-family="Arial, sans-serif" fill="#fff">Bienvenue</text>
|
||||
<circle cx="200" cy="50" r="20" fill="#fff"/>
|
||||
<circle cx="200" cy="150" r="20" fill="#fff"/>
|
||||
<rect x="20" y="260" width="360" height="30" fill="#4567b7" rx="10"/>
|
||||
<text x="20" y="280" font-size="18" font-family="Arial, sans-serif" fill="#fff">Informations</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 888 B |
|
After Width: | Height: | Size: 598 KiB |
|
After Width: | Height: | Size: 537 KiB |
BIN
generated/wevia-img-gemini-cat-space-20260422-145136-259830.jpg
Normal file
|
After Width: | Height: | Size: 872 KiB |
|
After Width: | Height: | Size: 336 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 804 KiB |
BIN
generated/wevia-img-gemini-wevia-logo-20260422-145006-e3844c.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 467 KiB |
|
After Width: | Height: | Size: 707 KiB |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="100" y="100" width="100" height="100" rx="10" fill="#03A9F4" />
|
||||
<rect x="150" y="150" width="50" height="50" rx="5" fill="#FFFFFF" />
|
||||
<rect x="200" y="100" width="50" height="50" rx="5" fill="#FFFFFF" />
|
||||
<rect x="250" y="150" width="50" height="50" rx="5" fill="#FFFFFF" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 360 B |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="150" y="100" width="100" height="100" rx="10" fill="#34A8FF" />
|
||||
<rect x="150" y="150" width="100" height="100" rx="10" fill="#34A8FF" />
|
||||
<path d="M 200,150 L 250,150 L 225,200 L 200,150" stroke="#FFFFFF" stroke-width="5" fill="none" />
|
||||
<path d="M 250,150 L 225,200 L 275,200 L 250,150" stroke="#FFFFFF" stroke-width="5" fill="none" />
|
||||
<text x="200" y="250" font-size="40" font-family="Arial" fill="#FFFFFF">WE</text>
|
||||
<text x="220" y="280" font-size="40" font-family="Arial" fill="#FFFFFF">VIA</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 590 B |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="20" y="20" width="360" height="260" rx="20" fill="#3498db" />
|
||||
<rect x="60" y="60" width="280" height="180" rx="20" fill="#2ecc71" />
|
||||
<rect x="100" y="100" width="200" height="100" rx="20" fill="#f1c40f" />
|
||||
<ellipse cx="200" cy="150" rx="50" ry="50" fill="#e74c3c" />
|
||||
<path d="M 220 150 L 200 170 L 180 150" fill="#e74c3c" />
|
||||
<text x="200" y="220" font-size="24" font-family="Arial" fill="#fff">WEVAL</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 497 B |
BIN
generated/wevia-img-maroc-paysage-20260422-132902-07b9d2.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
@@ -0,0 +1,29 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
||||
<rect x="50" y="50" width="300" height="200" rx="20" fill="#f7f7f7"/>
|
||||
<circle cx="150" cy="150" r="50" fill="#ff9900"/>
|
||||
<path d="M 250 100 L 200 150 L 300 150 Z" fill="#ff9900"/>
|
||||
<path d="M 120 120 L 120 180 L 180 180 L 180 120 Z" fill="#ff9900"/>
|
||||
<g transform="translate(120,120)">
|
||||
<rect x="0" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="0" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
</g>
|
||||
<g transform="translate(220,120)">
|
||||
<rect x="0" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="0" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="0" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="25" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
<rect x="50" y="25" width="20" height="20" fill="#ff9900"/>
|
||||
</g>
|
||||
<text x="220" y="140" font-size="24" font-family="Arial" fill="#000000">VITAMINE D</text>
|
||||
<text x="220" y="170" font-size="24" font-family="Arial" fill="#000000">POUR ENFANTS</text>
|
||||
<path d="M 200 220 L 220 250 L 200 280 Z" fill="#ff9900"/>
|
||||
<path d="M 180 220 L 160 250 L 180 280 Z" fill="#ff9900"/>
|
||||
<path d="M 160 220 L 140 250 L 160 280 Z" fill="#ff9900"/>
|
||||
<path d="M 140 220 L 120 250 L 140 280 Z" fill="#ff9900"/>
|
||||
<path d="M 120 220 L 100 250 L 120 280 Z" fill="#ff9900"/>
|
||||
<path d="M 100 220 L 80 250 L 100 280 Z" fill
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
BIN
generated/wevia-img-test-20260422-135506-86a876.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
103
generated/wevia-pdf-premium-20260422-093019-2f11b7.html
Normal file
@@ -0,0 +1,103 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Améliorer l'efficacité et la productivité avec SAP S4HANA</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
|
||||
<style>
|
||||
@page { margin: 0; size: A4; }
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body { font-family: 'Helvetica Neue', Arial, sans-serif; color: #1a1a2e; line-height: 1.6; }
|
||||
.cover { height: 297mm; background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #3b82f6 100%); color: #fff; padding: 80px 70px; display: flex; flex-direction: column; justify-content: space-between; page-break-after: always; }
|
||||
.cover .brand { font-size: 14px; letter-spacing: 4px; text-transform: uppercase; opacity: 0.9; }
|
||||
.cover h1 { font-size: 56px; line-height: 1.1; font-weight: 800; margin: 40px 0 20px; }
|
||||
.cover .subt { font-size: 22px; font-weight: 300; opacity: 0.92; max-width: 80%; }
|
||||
.cover .meta { font-size: 13px; opacity: 0.85; border-top: 1px solid rgba(255,255,255,0.3); padding-top: 24px; }
|
||||
.page { padding: 40px 55px 55px; min-height: 297mm; page-break-after: always; }
|
||||
.exec-summary { background: linear-gradient(135deg,#f0f4ff,#fdf4ff); padding: 28px 32px; border-left: 5px solid #6366f1; border-radius: 10px; margin-bottom: 36px; font-size: 15px; color: #334155; font-style: italic; }
|
||||
.kpis { display: flex; gap: 16px; margin: 32px 0; }
|
||||
.kpi { flex: 1; background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 24px 20px; text-align: center; box-shadow: 0 2px 8px rgba(99,102,241,0.08); }
|
||||
.kpi-value { font-size: 36px; font-weight: 800; color: #6366f1; margin-bottom: 6px; }
|
||||
.kpi-label { font-size: 13px; color: #64748b; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; }
|
||||
.kpi-trend { font-size: 12px; color: #10b981; font-weight: 600; }
|
||||
.chart-wrap { background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; padding: 28px; margin: 32px 0; }
|
||||
.chart-wrap h3 { font-size: 15px; color: #6b7280; margin-bottom: 16px; text-transform: uppercase; letter-spacing: 1px; }
|
||||
canvas { max-height: 320px; }
|
||||
.sec { margin-bottom: 32px; break-inside: avoid; }
|
||||
.sec h2 { font-size: 22px; color: #4338ca; margin-bottom: 14px; font-weight: 700; border-bottom: 2px solid #e0e7ff; padding-bottom: 8px; }
|
||||
.sec p { font-size: 14.5px; color: #334155; margin-bottom: 12px; }
|
||||
.sec ul { margin-left: 24px; }
|
||||
.sec li { font-size: 14px; color: #475569; margin-bottom: 6px; padding-left: 4px; }
|
||||
.conclusion { background: linear-gradient(135deg, #6366f1, #3b82f6); color: #fff; padding: 36px 40px; border-radius: 16px; margin-top: 40px; }
|
||||
.conclusion h2 { font-size: 22px; margin-bottom: 14px; }
|
||||
.conclusion p { font-size: 15.5px; line-height: 1.65; }
|
||||
.footer { position: fixed; bottom: 16mm; left: 55px; right: 55px; font-size: 10px; color: #94a3b8; display: flex; justify-content: space-between; border-top: 1px solid #e2e8f0; padding-top: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Cover page -->
|
||||
<div class="cover">
|
||||
<div>
|
||||
<div class="brand">WEVAL Consulting · Rapport Premium</div>
|
||||
<h1>Améliorer l'efficacité et la productivité avec SAP S4HANA</h1>
|
||||
<div class="subt">Découvrez les avantages et le retour sur investissement de SAP S4HANA</div>
|
||||
</div>
|
||||
<div class="meta">Généré le 22 April 2026 · WEVIA Enterprise Intelligence</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="page">
|
||||
<div class="exec-summary">SAP S4HANA est une plateforme de gestion d'entreprise (ERP) qui offre une série d'avantages et de retours sur investissement significatifs pour les entreprises. En intégrant des processus métier, des données et des applications, SAP S4HANA permet aux entreprises de réduire les coûts, d'améliorer la productivité et de prendre des décisions éclairées.</div>
|
||||
|
||||
<div class="kpis"><div class='kpi'><div class='kpi-value'>15%</div><div class='kpi-label'>Réduction des coûts opérationnels</div><div class='kpi-trend'>-10pts</div></div><div class='kpi'><div class='kpi-value'>20%</div><div class='kpi-label'>Augmentation de la productivité</div><div class='kpi-trend'>+5pts</div></div><div class='kpi'><div class='kpi-value'>80/100</div><div class='kpi-label'>Amélioration de la collaboration</div><div class='kpi-trend'>+10%</div></div></div>
|
||||
|
||||
<div class="chart-wrap">
|
||||
<h3>Visualisation des données</h3>
|
||||
<canvas id="mainChart"></canvas>
|
||||
</div>
|
||||
|
||||
<section class='sec'><h2>1. Avantages clés de SAP S4HANA</h2><p>SAP S4HANA offre une série d'avantages clés qui peuvent aider les entreprises à améliorer leur efficacité et leur productivité. Ces avantages incluent une meilleure visibilité opérationnelle, une réduction des coûts, une amélioration de la collaboration et une prise de décision éclairée.</p><ul><li>Réduction des coûts opérationnels</li><li>Amélioration de la visibilité opérationnelle</li><li>Augmentation de la productivité</li><li>Amélioration de la collaboration</li></ul></section><section class='sec'><h2>2. Retour sur investissement de SAP S4HANA</h2><p>Le retour sur investissement de SAP S4HANA peut être significatif pour les entreprises qui l'implémentent. Selon des études, les entreprises qui ont implémenté SAP S4HANA ont pu réaliser des économies de coûts de l'ordre de 10 à 20%.</p><ul><li>Réduction des coûts opérationnels</li><li>Augmentation de la productivité</li><li>Amélioration de la collaboration</li><li>Amélioration de la prise de décision</li></ul></section><section class='sec'><h2>3. Cas d'utilisation de SAP S4HANA</h2><p>SAP S4HANA peut être utilisé dans une variété de secteurs et de cas d'utilisation. Les entreprises peuvent utiliser SAP S4HANA pour gérer leurs processus métier, leurs données et leurs applications.</p><ul><li>Gestion des processus métier</li><li>Gestion des données</li><li>Gestion des applications</li><li>Intégration avec d'autres systèmes</li></ul></section>
|
||||
|
||||
<div class="conclusion">
|
||||
<h2>Conclusion & recommandations</h2>
|
||||
<p>En résumé, SAP S4HANA offre une série d'avantages et de retours sur investissement significatifs pour les entreprises. Les entreprises qui l'implémentent peuvent réduire leurs coûts opérationnels, augmenter leur productivité et améliorer leur collaboration. Nous recommandons aux entreprises de considérer l'implémentation de SAP S4HANA pour améliorer leur efficacité et leur productivité.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<span>WEVAL Consulting · weval-consulting.com</span>
|
||||
<span>Confidentiel · Usage interne</span>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addEventListener("load", function(){
|
||||
try {
|
||||
var cd = {"type":"bar","title":"Réduction des coûts opérationnels","labels":["Année 1","Année 2","Année 3","Année 4","Année 5"],"values":[12,15,18,20,22]};
|
||||
if (!cd) return;
|
||||
var ctx = document.getElementById("mainChart").getContext("2d");
|
||||
new Chart(ctx, {
|
||||
type: cd.type || "bar",
|
||||
data: {
|
||||
labels: cd.labels || [],
|
||||
datasets: [{
|
||||
label: cd.title || "Données",
|
||||
data: cd.values || [],
|
||||
backgroundColor: ["#6366f1","#8b5cf6","#3b82f6","#06b6d4","#10b981","#f59e0b","#ef4444","#ec4899"],
|
||||
borderColor: "#4338ca",
|
||||
borderWidth: 2,
|
||||
borderRadius: 6,
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
maintainAspectRatio: true,
|
||||
plugins: { legend: { display: false }, title: { display: true, text: cd.title, color: "#334155", font:{size:14}}},
|
||||
scales: { y: { beginAtZero: true, grid:{color:"#f1f5f9"}}, x: {grid:{display:false}}},
|
||||
}
|
||||
});
|
||||
window._wevia_chart_ready = true;
|
||||
} catch(e) { console.error("chart fail", e); }
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||