ChatLogic.php 5.3 KB
<?php
/**
 * @remark :
 * @name   :ChatLogic.php
 * @author :lyh
 * @method :post
 * @time   :2025/4/1 14:37
 */

namespace App\Http\Logic\Bside\Gpt;

use App\Helper\Stream;
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']],
                ];
            }
        } 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];
        $stream = $gptService->get_ai_chat($data); // 获取流
        // 允许跨域访问
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
        header('Access-Control-Allow-Headers: Content-Type, Authorization');

        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header('Connection: keep-alive');
        $aiResponse = '';
        $buffer = '';
        while (!$stream->eof()) {
            $chunk = $stream->read(1024);
            $chunk = str_replace(chr(1), '', $chunk);
            if ($chunk !== false) {
                // 累积数据
                $buffer .= $chunk;
                // 持续解析完整的 JSON
                while (preg_match('/^\{[^{}]*\}/', $buffer, $match)) {
                    $jsonStr = $match[0];
                    $jsonData = json_decode($jsonStr, true);
                    // 确保 JSON 解析成功
                    if (json_last_error() === JSON_ERROR_NONE) {
                        if (isset($jsonData['text'])) {
                            $aiResponse .= $jsonData['text'];
                            echo $gptService->en_sse_data($jsonData['text']);
                            ob_flush();
                            flush();
                        }
                        // 移除已解析的 JSON,保留未完成的部分
                        $buffer = substr($buffer, strlen($jsonStr));
                    } else {
                        break;
                    }
                }
            }
        }
        $this->saveChatItem($chatId, $aiResponse, 1);
        return true;
    }

    /**
     * @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'=>mb_substr($message, 0, 50, "UTF-8").'...',
        ];
        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,
        ];
        //同时更改主任务
        $this->itemModel->addReturnId($saveData);
        $data = ['last_created_at'=>date('Y-m-d H:i:s'),'last_input_content'=>mb_substr($message, 0, 50, "UTF-8").'...'];
        return $this->model->edit($data,['id'=>$id]);
    }
}