From 8cf502971160b9d305655b39c9f6e608250d0a2e Mon Sep 17 00:00:00 2001 From: lkddi Date: Sat, 25 Apr 2026 00:42:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ai=E5=B0=8F=E7=8F=AD=E9=95=BF?= =?UTF-8?q?=E8=81=8A=E5=A4=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/ChatBotController.php | 8 +++-- .../views/chat/partials/ai-chatbot.blade.php | 36 ++++++++++++------- .../views/chat/partials/scripts.blade.php | 2 +- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/ChatBotController.php b/app/Http/Controllers/ChatBotController.php index 01f8293..3e7d9c5 100644 --- a/app/Http/Controllers/ChatBotController.php +++ b/app/Http/Controllers/ChatBotController.php @@ -56,8 +56,12 @@ class ChatBotController extends Controller $request->validate([ 'message' => 'required|string|max:2000', 'room_id' => 'required|integer', + 'is_secret' => 'nullable|boolean', ]); + // 私聊模式:AI 回复也走悄悄话,仅发言人和 AI 可见 + $isSecret = (bool) $request->input('is_secret', false); + // 检查全局开关 $enabled = Sysparam::getValue('chatbot_enabled', '0'); if ($enabled !== '1') { @@ -148,14 +152,14 @@ class ChatBotController extends Controller } } - // 广播 AI 回复消息 + // 广播 AI 回复消息(私聊模式下仅发言人与 AI 可见) $botMsg = [ 'id' => $this->chatState->nextMessageId($roomId), 'room_id' => $roomId, 'from_user' => 'AI小班长', 'to_user' => $user->username, 'content' => $reply, - 'is_secret' => false, + 'is_secret' => $isSecret, 'font_color' => '#16a34a', 'action' => '', 'sent_at' => now()->toDateTimeString(), diff --git a/resources/views/chat/partials/ai-chatbot.blade.php b/resources/views/chat/partials/ai-chatbot.blade.php index 5c7b56e..7955e0d 100644 --- a/resources/views/chat/partials/ai-chatbot.blade.php +++ b/resources/views/chat/partials/ai-chatbot.blade.php @@ -6,13 +6,30 @@ * 发送消息给 AI 机器人 * 先在包厢窗口显示用户消息,再调用 API 获取回复 */ - async function sendToChatBot(content) { + async function sendToChatBot(content, isSecret = false) { if (chatBotSending) { window.chatDialog.alert('AI 正在思考中,请稍候...', '提示', '#336699'); return; } chatBotSending = true; + /** + * 将 AI 错误提示追加到包厢窗口,样式与正常 AI 回复保持一致。 + * + * @param {string} text 错误提示文本 + */ + function appendBotError(text) { + const msgBox = document.getElementById('chat-messages-container2'); + if (!msgBox) return; + const errDiv = document.createElement('div'); + errDiv.className = 'msg-line'; + errDiv.innerHTML = `🤖【AI小班长】${text}`; + msgBox.appendChild(errDiv); + if (typeof autoScroll !== 'undefined' && autoScroll) { + msgBox.scrollTop = msgBox.scrollHeight; + } + } + try { const res = await fetch(window.chatContext.chatBotUrl, { method: 'POST', @@ -24,28 +41,23 @@ }, body: JSON.stringify({ message: content, - room_id: window.chatContext.roomId + room_id: window.chatContext.roomId, + is_secret: isSecret ? 1 : 0, }) }); const data = await res.json(); if (!res.ok || data.status !== 'success') { - const errDiv = document.createElement('div'); - errDiv.className = 'msg-line'; - errDiv.innerHTML = - `🤖【AI小班长】${data.message || '回复失败,请稍后重试'}`; - container.appendChild(errDiv); + // 接口返回的错误信息:仅显示在包厢窗口,不走公屏 + appendBotError(data.message || '回复失败,请稍后重试'); } } catch (e) { - const errDiv = document.createElement('div'); - errDiv.className = 'msg-line'; - errDiv.innerHTML = '🤖【AI小班长】网络连接错误,请稍后重试'; - container.appendChild(errDiv); + // 网络层异常:同样只显示在包厢窗口 + appendBotError('网络连接错误,请稍后重试'); } chatBotSending = false; - scrollToBottom(); } /** diff --git a/resources/views/chat/partials/scripts.blade.php b/resources/views/chat/partials/scripts.blade.php index b476109..5a8372e 100644 --- a/resources/views/chat/partials/scripts.blade.php +++ b/resources/views/chat/partials/scripts.blade.php @@ -3397,7 +3397,7 @@ // 如果发言对象是 AI 小助手,也发送一份给专用机器人 API,不打断正常的发消息流程 if (toUser === 'AI小班长' && content) { - sendToChatBot(content); // 异步调用,不阻塞全局发送 + sendToChatBot(content, composerState.isSecret); // 异步调用,私聊状态一并传递 } // ── 神秘箱子暗号拦截 ────────────────────────────────────