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
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['from_user']='-2';
|
|
$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;
|
|
}
|
|
}
|