This commit is contained in:
焦钰锟 2025-03-05 18:05:01 +08:00
parent 14d114771b
commit 2c0293d3b1

View File

@ -89,6 +89,12 @@ class Question extends BaseModel
$deepseek_local_url = config("site.deepseek_local_url"); $deepseek_local_url = config("site.deepseek_local_url");
//得到切换开关 //得到切换开关
$deepseek_switch = config("site.deepseek_switch"); $deepseek_switch = config("site.deepseek_switch");
//请求池
$deepseek_pool = config("site.deepseek_pool");
//重置下标
$deepseek_pool = array_values($deepseek_pool);
$reasoning =true; $reasoning =true;
$last = end($messages); $last = end($messages);
if ($last['role'] == 'assistant') { if ($last['role'] == 'assistant') {
@ -97,6 +103,19 @@ class Question extends BaseModel
throw new \Exception('messages参数错误'); throw new \Exception('messages参数错误');
} }
} }
//默认截断下标为末尾
$cut = count($messages);
//遍历素$messages如果其中有一项assistant的content为空则从这一项assistant在内截断不要了
foreach ($messages as $keys => $message){
if ($message['role'] == 'assistant' && !$message['content']) {
$cut = $keys;
break;
}
}
$messages = array_slice($messages, 0, $cut);
//访问deepseek脚本存在超时可能会超时所以需要设置超时时间为10分钟 //访问deepseek脚本存在超时可能会超时所以需要设置超时时间为10分钟
set_time_limit(6000); set_time_limit(6000);
@ -110,7 +129,7 @@ class Question extends BaseModel
//"temperature":0.6 //"temperature":0.6
//} //}
$data = [ $data = [
'model' => $deepseek_switch ? 'qwen':'deepseek-reasoner', 'model' => $deepseek_switch ? 'deepseek-r1':'deepseek-reasoner',
'messages' => $messages, 'messages' => $messages,
'stream' => true, 'stream' => true,
'temperature' => 0.6, 'temperature' => 0.6,
@ -141,34 +160,79 @@ class Question extends BaseModel
// 判断逻辑 // 判断逻辑
$url = $deepseek_switch ? $deepseek_local_url : $deepseek_web_url; if($deepseek_switch) {
//本地逻辑
//得到池里的链接数量
$pool_count = count($deepseek_pool);
if ($pool_count == 0) {
throw new \Exception('链接池为空!');
}
// //随机获取一个链接
// $pool_index = array_rand($deepseek_pool);
// $url = $deepseek_pool[$pool_index];
// $url = $url .$deepseek_local_url;
//通过cache计数当前请求数
$pool_index = cache('deepseek_pool_index') ?? 0;
$pool_index = $pool_index % $pool_count;
// var_dump($pool_index);
cache('deepseek_pool_index', $pool_index + 1);
$url = $deepseek_pool[$pool_index] . $deepseek_local_url;
}else{
//远程逻辑
$url = $deepseek_web_url;
}
// $url = $deepseek_switch ? $deepseek_local_url : $deepseek_web_url;
$headers = $deepseek_switch ? [] : ['Authorization:' . $deepseek_key]; $headers = $deepseek_switch ? [] : ['Authorization:' . $deepseek_key];
// file_put_contents("test.txt",$messages."\r\n",FILE_APPEND);
// 发送curl post json格式的 stream式请求 // 发送curl post json格式的 stream式请求
$ch = curl_init(); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_URL, $url);
//设置等待=时间无限
curl_setopt($ch, CURLOPT_TIMEOUT, 0);
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge(['Content-Type: application/json'], $headers)); curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge(['Content-Type: application/json'], $headers));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) use (&$response,$question_id,$deepseek_switch,&$reasoning,$session_key) { curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) use (&$response,$question_id,$deepseek_switch,&$reasoning,$session_key,$url) {
// var_dump($data); // var_dump($data);
file_put_contents("test.txt",$url.$data."\r\n",FILE_APPEND);
// if (!$data) {
// return 0; // 结束流式请求
// }
if (!$data) {
return 0; // 结束流式请求
}
// var_dump($data); // var_dump($data);
$data = htmlspecialchars_decode($data); $data = htmlspecialchars_decode($data);
// 处理每一部分数据 // 处理每一部分数据
// $lines = explode("\n", trim($data)); // $lines = explode("\n", trim($data));
$lines = explode("\n",$data); $lines = explode("\n",$data);
if(!$lines){
throw new \Exception($data);
}
foreach ($lines as $line) { foreach ($lines as $line) {
if (strpos($line, "data: ") === 0) { if (strpos($line, "data: ") === 0) {
$json = substr($line, 6); $json = substr($line, 6);
$chunk = json_decode($json, true); $chunk = json_decode($json, true);
if(isset($chunk['error']) && $chunk['error']){
throw new \Exception($chunk['error']);
}
// if(!isset($chunk['choices'][0]['delta']['reasoning_content']) && !isset($chunk['choices'][0]['delta']['content'])){
// throw new \Exception($data);
// }
if (isset($chunk['choices'][0]['delta']['reasoning_content'])) { if (isset($chunk['choices'][0]['delta']['reasoning_content'])) {
$chunk['choices'][0]['delta']['reasoning_content'] = htmlspecialchars_decode($chunk['choices'][0]['delta']['reasoning_content']); $chunk['choices'][0]['delta']['reasoning_content'] = htmlspecialchars_decode($chunk['choices'][0]['delta']['reasoning_content']);
@ -186,7 +250,7 @@ class Question extends BaseModel
//本地部署</think>为结尾 //本地部署</think>为结尾
if(strpos($chunk['choices'][0]['delta']['content'],'</think>')!==false){ if(strpos($chunk['choices'][0]['delta']['content'],'</think>')!==false){
$reasoning = false; $reasoning = false;
}else{ }elseif(strpos($chunk['choices'][0]['delta']['content'],'<think>')===false){
$this->saveStreamData($chunk['choices'][0]['delta']['content'],$chunk,$question_id,$reasoning,$session_key); $this->saveStreamData($chunk['choices'][0]['delta']['content'],$chunk,$question_id,$reasoning,$session_key);
} }
@ -202,6 +266,16 @@ class Question extends BaseModel
} }
} }
}else{
// throw new \Exception($data);
$chunk = json_decode($line, true);
if($chunk && isset($chunk['error']) && $chunk['error']){
throw new \Exception($chunk['error']);
}
} }
} }