34 lines
2.3 KiB
PHP
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);
|