request->param('content'); // 限制文字内容长度 $text = strip_tags($content); $textLen = mb_strlen($text); if ($textLen > 2048) { return warning(lang('im.msgContentLimit') . $textLen); } // 接入聊天内容检测服务 event('GreenText',['content'=>$content,'service'=>"chat_detection"]); $postData = $this->curlChat($content); $userInfo = $this->userInfo; $uid = $userInfo['id']; if (!isset($postData['choices'][0]['message']['content'])) { return warning(lang('system.fail')); } $newContent = $postData['choices'][0]['message']['content']; $newContent = '
' . $newContent . "
"; if ($this->error) { return warning($this->error); } $chat_identify = '-2-'.$uid; $data = [ 'from_user'=> 1, 'to_user'=> $uid, 'content'=>str_encipher($newContent,true), 'chat_identify'=>'-2-'.$uid, 'create_time'=>time(), 'type'=>'text', 'is_group'=>4, 'is_read'=>1, 'is_top'=>0, 'is_notice'=>1, 'is_last'=>1, 'at'=>[], 'pid'=>0, 'extends'=>['chat'=>$newContent], ]; $data['id']=\utils\Str::getUuid(); Message::update(['is_last'=>0],['chat_identify'=>$chat_identify]); $message=new Message(); $message->save($data); $msgId=$message->msg_id; $msgInfo=$data; $msgInfo['status']='successd'; $msgInfo['msg_id']=$msgId; $msgInfo['user_id']=1; $msgInfo['sendTime']=time()*1000; $msgInfo['toContactId']='-2'; $msgInfo['to_user']='ai_chat'; $msgInfo['content']=$newContent; $msgInfo['fromUser']=[ 'id'=>'-2', 'avatar'=>getMainHost().'/static/common/img/ai.png', 'displayName'=>lang('system.ai') ]; wsSendMsg($uid,'simple',$msgInfo); return success('', $msgInfo); } protected function curlChat($content) { $url = "https://api.siliconflow.cn/v1/chat/completions"; $data = [ 'model' => 'deepseek-ai/Deepseek-V3', 'max_tokens' => 512, 'enable_thinking' => true, 'thinking_budget' => 4096, 'min_p' => 0.05, 'temperature' => 0.7, 'top_p' => 0.7, 'frequency_penalty' => 0.5, 'n' => 1, 'stream' => false, 'stop' => [], 'messages' => [ [ 'role' => 'system', 'content' => $content ] ], ]; $key = 'sk-tfvzhlgatdoczhfcwgfruetxogmrhcyhhqdirwefadmvfibs'; $header = [ "Authorization: Bearer {$key}", 'Content-Type: application/json' ]; $json_data = json_encode($data); $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $json_data, CURLOPT_HTTPHEADER => $header, ]); // 跳过证书验证(不推荐在生产环境使用) curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { // $this->error = "cURL Error #:" . $err; $this->error = lang('system.fail'); return false; } $response = json_decode($response,true); if (!is_array($response)) { //$this->error = "cURL Error #:" . $response; $this->error = lang('system.fail'); return false; } return $response; } }