即时系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

144 lines
4.2 KiB

<?php
namespace app\enterprise\controller;
use app\BaseController;
use app\enterprise\model\Message;
use utils\Curl;
class Chat extends BaseController
{
protected $error = '';
public function sendChat()
{
$content = $this->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 = '<p>' . $newContent . "</p>";
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;
}
}