From d87d3ed9e1a4f751edb08577dce31f596a1084a6 Mon Sep 17 00:00:00 2001 From: wong <106998207@qq.com> Date: Fri, 19 Sep 2025 16:49:25 +0800 Subject: [PATCH] =?UTF-8?q?AI=E5=AF=B9=E8=AF=9D=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chukebao/controller/AiChatController.php | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 Server/application/chukebao/controller/AiChatController.php diff --git a/Server/application/chukebao/controller/AiChatController.php b/Server/application/chukebao/controller/AiChatController.php new file mode 100644 index 00000000..c488a1ad --- /dev/null +++ b/Server/application/chukebao/controller/AiChatController.php @@ -0,0 +1,106 @@ +getUserInfo('id'); + $companyId = $this->getUserInfo('companyId'); + $friendId = $this->request->param('friendId', ''); + $wechatAccountId = $this->request->param('wechatAccountId', ''); + $content = $this->request->param('content', ''); + + if (empty($wechatAccountId) || empty($friendId)){ + return ResponseHelper::error('参数缺失'); + } + + $tokens = Db::name('users') + ->where('id', $userId) + ->where('companyId', $companyId) + ->value('tokens'); + if ($tokens <= 0){ + return ResponseHelper::error('用户Tokens余额不足'); + } + + + //读取AI配置 + $setting = Db::name('ai_settings')->where(['companyId' => $companyId,'userId' => $userId])->find(); + if(empty($setting)){ + return ResponseHelper::error('未找到配置信息,请先配置AI策略'); + } + $config = json_decode($setting['config'],true); + $modelSetting = $config['modelSetting']; + $round = isset($config['round']) ? $config['round'] : 10; + + + // 导出聊天 + $messages = Db::table('s2_wechat_message') + ->where('wechatFriendId', $friendId) + ->order('wechatTime desc') + ->field('id,content,msgType,isSend,wechatTime') + ->limit($round) + ->select(); + + usort($messages, function($a, $b) { + return $a['wechatTime'] <=> $b['wechatTime']; + }); + + //处理聊天数据 + $msg = []; + foreach ($messages as $val){ + if (empty($val['content'])){ + continue; + } + if (!empty($val['isSend'])){ + $msg[] = '客服:' . $val['content']; + }else{ + $msg[] = '用户:' . $val['content']; + } + } + $content = implode("\n", $msg); + + + $params = [ + 'model' => 'doubao-1-5-pro-32k-250115', + 'messages' => [ + // ['role' => 'system', 'content' => '请完成跟客户的对话'], + ['role' => 'system', 'content' => '角色设定:' . $modelSetting['role']], + ['role' => 'system', 'content' => '公司背景:' . $modelSetting['businessBackground']], + ['role' => 'system', 'content' => '对话风格:' . $modelSetting['dialogueStyle']], + ['role' => 'user', 'content' => $content], + ], + ]; + + //AI处理 + $ai = new DouBaoAI(); + $res = $ai->text($params); + $res = json_decode($res,true); + + if ($res['code'] == 200) { + //扣除Tokens + $tokensRecord = new tokensRecord(); + $nickname = Db::table('s2_wechat_friend')->where(['id' => $friendId])->value('nickname'); + $remarks = !empty($nickname) ? '与好友【'.$nickname.'】聊天' : '与好友聊天'; + $data = [ + 'tokens' => $res['data']['token'], + 'type' => 0, + 'form' => 1, + 'wechatAccountId' => $wechatAccountId, + 'friendIdOrGroupId' => $friendId, + 'remarks' => $remarks, + ]; + $tokensRecord->consumeTokens($data); + return ResponseHelper::success($res['data']['content']); + }else{ + return ResponseHelper::error($res['msg']); + } + + + } +} \ No newline at end of file