Files
html/api/wevia-consensus.php
2026-04-12 22:57:03 +02:00

34 lines
2.3 KiB
PHP

<?php
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Origin: *");
if ($_SERVER["REQUEST_METHOD"]==="OPTIONS"){http_response_code(200);exit;}
$input = json_decode(file_get_contents("php://input"), true) ?: [];
$msg = $input["message"] ?? $_GET["q"] ?? "";
if (!$msg) { echo json_encode(["error"=>"message required"]); exit; }
$secrets=[];
foreach(file("/etc/weval/secrets.env",2|4) as $l){if(strpos($l,"=")!==false){list($k,$v)=explode("=",$l,2);$secrets[trim($k)]=trim($v," \t\"'");}}
$providers = [
["name"=>"cerebras","url"=>"https://api.cerebras.ai/v1/chat/completions","key"=>$secrets["CEREBRAS_API_KEY"]??"","model"=>"qwen-3-235b-a22b-instruct-2507"],
["name"=>"groq","url"=>"https://api.groq.com/openai/v1/chat/completions","key"=>$secrets["GROQ_KEY"]??$secrets["GROQ_API_KEY"]??"","model"=>"llama-3.3-70b-versatile"],
["name"=>"kimi","url"=>"https://api.groq.com/openai/v1/chat/completions","key"=>$secrets["GROQ_KEY"]??$secrets["GROQ_API_KEY"]??"","model"=>"moonshotai/kimi-k2-instruct"],
];
$mh = curl_multi_init(); $handles = [];
foreach ($providers as $i => $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"=>[["role"=>"user","content"=>$msg]],"max_tokens"=>800,"temperature"=>0.3]),CURLOPT_HTTPHEADER=>["Content-Type: application/json","Authorization: Bearer ".$p["key"]],CURLOPT_RETURNTRANSFER=>true,CURLOPT_TIMEOUT=>15]);
curl_multi_add_handle($mh, $ch); $handles[$i] = $ch;
}
do { curl_multi_exec($mh, $running); usleep(10000); } while ($running > 0);
$responses = [];
foreach ($handles as $i => $ch) {
$d = json_decode(curl_multi_getcontent($ch), true);
$c = $d["choices"][0]["message"]["content"] ?? "";
if ($c) $responses[] = ["provider"=>$providers[$i]["name"],"model"=>$providers[$i]["model"],"content"=>$c,"length"=>strlen($c)];
curl_multi_remove_handle($mh, $ch); curl_close($ch);
}
curl_multi_close($mh);
$best = ""; $bestLen = 0;
foreach ($responses as $r) { if ($r["length"] > $bestLen) { $best = $r["content"]; $bestLen = $r["length"]; } }
echo json_encode(["consensus"=>$best,"providers_count"=>count($responses),"responses"=>array_map(function($r){return["provider"=>$r["provider"],"length"=>$r["length"]];}, $responses)], JSON_UNESCAPED_UNICODE);