Files
html/api/saas-chat.php
2026-04-16 21:20:01 +02:00

40 lines
2.3 KiB
PHP

<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
if($_SERVER['REQUEST_METHOD']==='OPTIONS'){header('Access-Control-Allow-Methods: POST');header('Access-Control-Allow-Headers: Content-Type');exit;}
$input=json_decode(file_get_contents('php://input'),true);
$msg=$input['message']??$_POST['message']??'';
$session=$input['session']??$_POST['session']??'default';
$origin=$input['origin']??$_SERVER['HTTP_REFERER']??'unknown';
if(!$msg)die(json_encode(['error'=>'no message']));
// Redis memory
$history=[];
try{$redis=new Redis();$redis->connect('127.0.0.1',6379);$redis->select(3);
$raw=$redis->get("saas:$session");if($raw)$history=json_decode($raw,true)?:[];}catch(Exception $e){$redis=null;}
// Messages
$messages=[['role'=>'system','content'=>'Tu es WEVIA, IA de WEVAL Consulting Casablanca. Reponds en francais, utile et concis. Contexte: '.basename($origin)]];
foreach(array_slice($history,-6) as $h)$messages[]=$h;
$messages[]=['role'=>'user','content'=>$msg];
// Cascade
$env=[];foreach(@file('/etc/weval/secrets.env',2|4)?:[] as $l){if(strpos($l,'=')!==false){[$k,$v]=explode('=',$l,2);$env[trim($k)]=trim($v," \t\"'");}}
$providers=[
['u'=>'https://api.groq.com/openai/v1/chat/completions','k'=>$env['GROQ_KEY']??'','m'=>'llama-3.3-70b-versatile'],
['u'=>'https://api.cerebras.ai/v1/chat/completions','k'=>$env['CEREBRAS_API_KEY']??'','m'=>'llama-3.3-70b'],
['u'=>'http://127.0.0.1:4000/v1/chat/completions','k'=>'sovereign','m'=>'auto'],
];
$reply='';
foreach($providers as $p){
if(!$p['k'])continue;
$ch=curl_init($p['u']);
curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>1,CURLOPT_POST=>1,CURLOPT_TIMEOUT=>12,
CURLOPT_HTTPHEADER=>['Content-Type: application/json','Authorization: Bearer '.$p['k']],
CURLOPT_POSTFIELDS=>json_encode(['model'=>$p['m'],'messages'=>$messages,'max_tokens'=>800])]);
$r=curl_exec($ch);$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);curl_close($ch);
if($code>=200&&$code<300){$d=json_decode($r,true);$reply=$d['choices'][0]['message']['content']??'';if($reply)break;}
}
if(!$reply)$reply='Service temporairement indisponible.';
$history[]=['role'=>'user','content'=>$msg];
$history[]=['role'=>'assistant','content'=>$reply];
if($redis)$redis->setex("saas:$session",3600,json_encode(array_slice($history,-20)));
echo json_encode(['response'=>$reply,'provider'=>'saas-sovereign','session'=>$session]);