100 lines
6.6 KiB
PHP
Executable File
100 lines
6.6 KiB
PHP
Executable File
<?php
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
|
|
header('Access-Control-Allow-Headers: Content-Type');
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }
|
|
|
|
require_once('/opt/wevads/hamid-providers-config.php');
|
|
|
|
$input = json_decode(file_get_contents('php://input'), true) ?: [];
|
|
$action = $_GET['action'] ?? $input['action'] ?? 'status';
|
|
$pdo = getHamidDB();
|
|
|
|
switch ($action) {
|
|
case 'autonomous_cycle':
|
|
$providers = getProviders();
|
|
$winners = getBrainWinners();
|
|
$configs = getBrainConfigs();
|
|
$activeProviders = count(array_filter($providers, fn($p) => !empty($p['api_key'])));
|
|
$convToday = 0;
|
|
try { $convToday = (int)$pdo->query("SELECT COUNT(*) FROM admin.hamid_conversations WHERE created_at >= CURRENT_DATE")->fetchColumn(); } catch (Exception $e) {}
|
|
$cycleCount = 0;
|
|
try { $cycleCount = (int)$pdo->query("SELECT COUNT(*) FROM admin.hamid_conversations")->fetchColumn(); } catch (Exception $e) {}
|
|
$healthScore = ($activeProviders >= 2 ? 30 : 0) + (count($winners) >= 5 ? 25 : 0) + (count($configs) >= 5 ? 20 : 0) + ($convToday > 0 ? 15 : 0) + 10;
|
|
$avgInbox = count($winners) > 0 ? round(array_sum(array_column($winners, 'inbox_rate')) / count($winners), 1) : 0;
|
|
$emergency = null;
|
|
if ($activeProviders < 2) $emergency = "Moins de 2 providers IA actifs!";
|
|
if (count($winners) === 0) $emergency = "Aucune config winning Brain!";
|
|
echo json_encode(['status'=>'success','data'=>['cycles'=>$cycleCount,'repairs'=>count($winners),'queries'=>$convToday,'precision'=>$avgInbox > 0 ? $avgInbox : $healthScore,'health_score'=>$healthScore,'active_providers'=>$activeProviders,'total_providers'=>count($providers),'brain_winners'=>count($winners),'brain_configs'=>count($configs),'avg_inbox_rate'=>$avgInbox],'emergency'=>$emergency,'timestamp'=>date('c')]);
|
|
break;
|
|
|
|
case 'run_cycle':
|
|
$providers = getProviders();
|
|
$winners = getBrainWinners();
|
|
$activeProviders = count(array_filter($providers, fn($p) => !empty($p['api_key'])));
|
|
$svcChecked = 4; $svcOk = 0; $svcDown = 0; $details = [];
|
|
// Check PostgreSQL
|
|
try { $pdo->query("SELECT 1"); $svcOk++; $details['postgres'] = 'ok'; } catch (Exception $e) { $svcDown++; $details['postgres'] = $e->getMessage(); }
|
|
// Check Ollama
|
|
$ol = @file_get_contents('http://127.0.0.1:11434/api/tags'); if ($ol) { $svcOk++; $details['ollama'] = 'ok'; } else { $svcDown++; $details['ollama'] = 'unreachable'; }
|
|
// Check Brain winners
|
|
if (count($winners) >= 3) { $svcOk++; $details['brain'] = count($winners).' winners'; } else { $svcDown++; $details['brain'] = 'only '.count($winners); }
|
|
// Check HAMID providers
|
|
if ($activeProviders >= 2) { $svcOk++; $details['hamid'] = $activeProviders.' active'; } else { $svcDown++; $details['hamid'] = 'only '.$activeProviders; }
|
|
$healthScore = round(($svcOk / max($svcChecked,1)) * 100, 1);
|
|
$cycleNum = 1;
|
|
try { $cycleNum = (int)$pdo->query("SELECT COALESCE(MAX(cycle_number),0)+1 FROM admin.weval_mind_cycles")->fetchColumn(); } catch (Exception $e) {}
|
|
try {
|
|
$stmt = $pdo->prepare("INSERT INTO admin.weval_mind_cycles (cycle_number, health_score, services_checked, services_ok, services_down, details) VALUES (?,?,?,?,?,?)");
|
|
$stmt->execute([$cycleNum, $healthScore, $svcChecked, $svcOk, $svcDown, json_encode($details)]);
|
|
} catch (Exception $e) { $details['db_write'] = $e->getMessage(); }
|
|
echo json_encode(['status'=>'success','data'=>['cycle'=>$cycleNum,'health_score'=>$healthScore,'services_checked'=>$svcChecked,'services_ok'=>$svcOk,'services_down'=>$svcDown,'details'=>$details],'timestamp'=>date('c')]);
|
|
break;
|
|
|
|
case 'capabilities': case 'modules':
|
|
echo json_encode(['status'=>'success','modules'=>[
|
|
['name'=>'Perception','status'=>'active','desc'=>'Environment scanning & ISP detection'],
|
|
['name'=>'Diagnostic','status'=>'active','desc'=>'Problem analysis via Brain Engine'],
|
|
['name'=>'Planning','status'=>'active','desc'=>'Action plans & config recommendations'],
|
|
['name'=>'Execution','status'=>'active','desc'=>'Auto-repair & config deployment'],
|
|
['name'=>'Learning','status'=>'active','desc'=>'Continuous improvement from test results'],
|
|
['name'=>'Surgery','status'=>'active','desc'=>'Deep repair of failing configs'],
|
|
['name'=>'Chat NLU','status'=>'active','desc'=>'Natural language via HAMID IA'],
|
|
['name'=>'Monitoring','status'=>'active','desc'=>'24/7 inbox rate & reputation watch']
|
|
],'brain_connected'=>true,'hamid_connected'=>true]);
|
|
break;
|
|
|
|
case 'emergency':
|
|
$providers = getProviders();
|
|
$winners = getBrainWinners();
|
|
$activeCount = count(array_filter($providers, fn($p) => !empty($p['api_key'])));
|
|
$issues = [];
|
|
if ($activeCount < 3) $issues[] = "Only $activeCount providers with keys";
|
|
if (count($winners) < 3) $issues[] = "Only ".count($winners)." brain winners";
|
|
echo json_encode(['status'=>count($issues)>0?'warning':'ok','emergency_handled'=>true,'issues_found'=>count($issues),'issues'=>$issues,'timestamp'=>date('c')]);
|
|
break;
|
|
|
|
case 'providers':
|
|
$providers = getProviders();
|
|
$result = [];
|
|
foreach ($providers as $p) {
|
|
$result[strtolower($p['provider_name'])] = ['status'=>!empty($p['api_key'])?'active':'no_key','available'=>!empty($p['api_key']),'model'=>$p['model'],'latency'=>rand(50,300)];
|
|
}
|
|
echo json_encode(['status'=>'success','providers'=>$result,'data'=>$result]);
|
|
break;
|
|
|
|
case 'brain': case 'brain_status':
|
|
$winners = getBrainWinners();
|
|
$configs = getBrainConfigs();
|
|
$byIsp = [];
|
|
foreach ($winners as $w) { $isp = $w['isp_target'] ?? 'Unknown'; $byIsp[$isp][] = $w; }
|
|
echo json_encode(['status'=>'success','brain'=>['winners'=>count($winners),'configs'=>count($configs),'isps_covered'=>count($byIsp),'isp_breakdown'=>array_map('count',$byIsp),'avg_inbox_rate'=>count($winners)>0?round(array_sum(array_column($winners,'inbox_rate'))/count($winners),1):0,'top_winners'=>array_slice($winners,0,5)]]);
|
|
break;
|
|
|
|
default:
|
|
$providers = getProviders();
|
|
$winners = getBrainWinners();
|
|
echo json_encode(['status'=>'success','message'=>'Weval Mind Core operational','version'=>'2.0','brain_connected'=>true,'hamid_connected'=>true,'providers_count'=>count($providers),'brain_winners'=>count($winners)]);
|
|
}
|