ChatLogic.php
3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
/**
* @remark :
* @name :ChatLogic.php
* @author :lyh
* @method :post
* @time :2025/4/1 14:37
*/
namespace App\Http\Logic\Bside\Gpt;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Gpt\Chat;
use App\Models\Gpt\ChatItem;
use App\Services\GptService;
class ChatLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->param = $this->requestAll;
$this->model = new Chat();
$this->itemModel = new ChatItem();
}
/**
* @remark :发送消息
* @name :sendMessage
* @author :lyh
* @method :post
* @time :2025/4/2 10:01
*/
public function sendMessage()
{
$gptService = new GptService();
$message = [];
if (isset($this->param['chat_id'])) {
$chatInfo = $this->model->read(['id' => $this->param['chat_id']]);
if ($chatInfo !== false) {
$this->saveChatItem($chatInfo['id'], $this->param['message']);
// 获取最近 2 条对话记录
$list = $this->itemModel->list(['chat_id' => $chatInfo['id']], 'id', ['*'], 'desc', 2);
$message[] = ['role' => 'system', 'content' => "You are now the marketing customer service of 深圳创贸集团"];
foreach ($list as $val) {
if ($val['is_reply'] == 2) {
$message[] = ['role' => 'user', 'content' => $val['content']];
} else {
$message[] = ['role' => 'assistant', 'content' => $val['content']];
}
}
$message[] = ['role' => 'user', 'content' => $this->param['message']];
$chatId = $chatInfo['id'];
}
} else {
$chatId = $this->saveChat($this->param['message']);
$this->saveChatItem($chatId, $this->param['message']);
$message = [
['role' => 'system', 'content' => "You are now the marketing customer service of 深圳创贸集团"],
['role' => 'user', 'content' => $this->param['message']],
];
}
$data = ['message' => $message];
return response()->stream(function () use ($gptService, $data, $chatId) {
$fullResponse = ''; // 存储完整 AI 回复
$response = $gptService->get_ai_chat($data); // 获取流
while (!$response->eof()) {
$chunk = $response->read(1024); // 逐步读取数据块
echo $gptService->en_sse_data($chunk); // **封装 SSE 数据**
ob_flush();
flush();
$fullResponse .= $chunk; // 拼接完整 AI 回复
}
// **流结束后,保存完整的 AI 回复**
$this->saveChatItem($chatId, $fullResponse ?: '服务器繁忙,请重试', 1);
}, 200, [
"Content-Type" => "text/event-stream",
"Cache-Control" => "no-cache",
"Connection" => "keep-alive",
]);
}
/**
* @remark :创建一条新会话
* @name :saveChat
* @author :lyh
* @method :post
* @time :2025/4/2 10:06
*/
public function saveChat($message){
//创建一个会话
$saveData = [
'user_id'=>$this->user['id'],
'input_content'=>$message,
];
return $this->model->addReturnId($saveData);
}
/**
* @remark :消息详情表保存一条记录
* @name :saveChatItem
* @author :lyh
* @method :post
* @time :2025/4/2 13:45
*/
public function saveChatItem($id,$message,$is_reply = 2){
//创建一个会话
$saveData = [
'user_id'=>$this->user['id'],
'is_reply'=>$is_reply,
'chat_id'=>$id,
'content'=>$message,
];
return $this->itemModel->addReturnId($saveData);
}
}