Files
weval-consulting/api/wevia-json-api.php
2026-04-08 03:40:03 +02:00

58 lines
2.8 KiB
PHP

<?php
// WEVIA JSON WRAPPER — converts autonomous SSE to simple JSON response
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD']==='OPTIONS'){http_response_code(200);exit;}
if (isset($_GET['action']) && $_GET['action']==='health') {
echo json_encode(['status'=>'online','providers'=>['cerebras','groq','sambanova','mistral','ollama']]);exit;
}
$input = json_decode(file_get_contents('php://input'), true) ?: [];
$msg = $input['message'] ?? $input['prompt'] ?? $_GET['q'] ?? '';
if (!$msg && !empty($input['messages'])) { $last = end($input['messages']); $msg = $last['content'] ?? ''; }
if (!$msg) { echo json_encode(['response'=>'','error'=>'empty']); exit; }
// Load secrets
$secrets = [];
foreach (file('/etc/weval/secrets.env', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES) as $l) {
if (empty(trim($l))||$l[0]==='#') continue;
$p = strpos($l,'=');
if ($p) $secrets[trim(substr($l,0,$p))] = trim(substr($l,$p+1)," \t\"'");
}
$providers = [
['url'=>'https://api.cerebras.ai/v1/chat/completions','key'=>$secrets['CEREBRAS_API_KEY']??'','model'=>'qwen-3-235b-a22b-instruct-2507','name'=>'Cerebras'],
['url'=>'https://api.groq.com/openai/v1/chat/completions','key'=>$secrets['GROQ_KEY']??'','model'=>'llama-3.3-70b-versatile','name'=>'Groq'],
['url'=>'https://api.sambanova.ai/v1/chat/completions','key'=>$secrets['SAMBANOVA_KEY']??'','model'=>'Meta-Llama-3.3-70B-Instruct','name'=>'SambaNova'],
['url'=>'https://api.mistral.ai/v1/chat/completions','key'=>$secrets['MISTRAL_KEY']??'','model'=>'mistral-small-latest','name'=>'Mistral'],
['url'=>'http://127.0.0.1:11435/v1/chat/completions','key'=>'ollama','model'=>'qwen3:8b','name'=>'Ollama'],
];
$sys = $input['system'] ?? 'Tu es WEVIA IA souveraine. Reponds en francais, concis.';
$messages = [['role'=>'system','content'=>$sys],['role'=>'user','content'=>$msg]];
foreach ($providers as $p) {
if (empty($p['key'])) continue;
$ch = curl_init($p['url']);
curl_setopt_array($ch, [
CURLOPT_POST=>true,
CURLOPT_POSTFIELDS=>json_encode(['model'=>$p['model'],'messages'=>$messages,'max_tokens'=>2048,'temperature'=>0.4]),
CURLOPT_HTTPHEADER=>['Content-Type: application/json','Authorization: Bearer '.$p['key']],
CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>30,
]);
$r = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code === 200) {
$d = json_decode($r, true);
$text = $d['choices'][0]['message']['content'] ?? '';
if ($text) {
echo json_encode(['response'=>$text,'provider'=>$p['name'],'model'=>$p['model']]);
exit;
}
}
}
echo json_encode(['response'=>'Tous les providers sont indisponibles.','error'=>'all_failed']);