'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]);