This commit is contained in:
rex
2025-11-26 18:01:01 +08:00
parent f811bd6659
commit 2c543f689c
2 changed files with 49 additions and 30 deletions

View File

@@ -1,3 +1,4 @@
/* 消息容器 */
#messages { #messages {
padding: 10px; padding: 10px;
margin-bottom: 10px; margin-bottom: 10px;
@@ -5,6 +6,7 @@
overflow-y: auto; overflow-y: auto;
} }
/* 消息 */
#messages div { #messages div {
border: 2px solid #000000; border: 2px solid #000000;
font-size: 14px; font-size: 14px;
@@ -14,31 +16,38 @@
border-radius: 5px; border-radius: 5px;
} }
/* 消息加载中 */
#messages>.message.loading { #messages>.message.loading {
border-color: #003cff; border-color: #003cff;
animation: pulse 1s infinite; animation: pulse 1s infinite;
} }
/* 消息加载中动画 */
@keyframes pulse { @keyframes pulse {
0% { 0% {
border-color: #6e90ff; border-color: #6e90ff;
} }
50% { 50% {
border-color: #002ec5; border-color: #002ec5;
} }
100% { 100% {
border-color: #6e90ff; border-color: #6e90ff;
} }
} }
/* 用户消息 */
#messages>.message.user { #messages>.message.user {
border-color: #c90000; border-color: #c90000;
} }
/* AI消息 */
#messages>.message.assistant { #messages>.message.assistant {
border-color: #06af2d; border-color: #06af2d;
} }
/* 输入容器 */
#input-container { #input-container {
border-top: 2px solid #000000; border-top: 2px solid #000000;
height: 100px; height: 100px;
@@ -47,12 +56,13 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
}
#input { /* 输入框 */
margin-bottom: 10px; #input {
height: 50px; margin-bottom: 10px;
width: 90%; height: 50px;
border: 1px solid #ccc; width: 90%;
border-radius: 5px; border: 1px solid #ccc;
} border-radius: 5px;
} }

View File

@@ -1,47 +1,52 @@
const mujianSdk = new window.MujianUMD.MujianSdk(); const mujianSdk = new window.MujianUMD.MujianSdk();
const stopController = new AbortController(); const stopController = new AbortController();
// 发送消息。入参是用户输入
async function send(query) { async function send(query) {
const id = Date.now(); const id = Date.now();
addMessage("assistant", "等待回复中...", id); addMessage("assistant", "等待回复中...", id); // 添加一个占位的AI消息。用于后续刷返回文字
startLoading(id); startLoading(id); // 给消息添加loading状态
await mujianSdk.ai.chat.complete( await mujianSdk.ai.chat.complete( // 调用 mujian sdk 发送请求
query, query,
(res) => { (res) => {
updateMessage(id, res.fullContent); updateMessage(id, res.fullContent); // 流式实时更新消息
if (res.isFinished) { if (res.isFinished) { // 如果流式完成结束则停止loading状态
stopLoading(id); stopLoading(id); // 停止loading状态
} }
}, },
stopController.signal, stopController.signal,
{ {
parseContent: true, parseContent: true, // 让 sdk 只返回消息内容,不会返回其他字段
}, },
); );
} }
// 停止发送消息
function stop() { function stop() {
stopController.abort(); stopController.abort();
} }
// 渲染所有消息
async function renderAllMessages() { async function renderAllMessages() {
const messages = await mujianSdk.ai.chat.message.getAll(); const messages = await mujianSdk.ai.chat.message.getAll(); // 通过 sdk 获取所有消息
renderMessages(messages); renderMessages(messages); // 渲染所有消息
scrollToBottom(); scrollToBottom(); // 滚动到底部
} }
// 更新消息。入参是消息id和消息内容
function updateMessage(id, message) { function updateMessage(id, message) {
if ($(`#message-assistant-${id}`).length === 0) { if ($(`#message-assistant-${id}`).length === 0) { // 如果消息不存在,则返回
return; return;
} }
$(`#message-assistant-${id}`).text("assistant: " + message); $(`#message-assistant-${id}`).text("assistant: " + message); // 更新消息内容
scrollToBottom(); scrollToBottom(); // 滚动到底部
} }
// 添加消息。入参是消息角色和消息内容
function addMessage(role, message, id = null) { function addMessage(role, message, id = null) {
const _id = id || Date.now(); const _id = id || Date.now(); // 如果消息id不存在则生成一个唯一id
$("#messages").append( $("#messages").append(
`<div id="message-${role}-${_id}" class="message ${role === "user" ? "user" : "assistant"}">${role}: ${message}</div>`, `<div id="message-${role}-${_id}" class="message ${role === "user" ? "user" : "assistant"}">${role}: ${message}</div>`, // 添加消息
); );
} }
@@ -64,28 +69,32 @@ function scrollToBottom() {
); );
} }
// 渲染消息。入参是消息列表
function renderMessages(messages) { function renderMessages(messages) {
// console.log("messages", messages); // console.log("messages", messages);
messages.forEach((message) => { messages.forEach((message) => {
// 添加消息
addMessage(message.role, message.content, message.id); addMessage(message.role, message.content, message.id);
}); });
} }
// 发送消息。点击发送按钮时,获取用户输入,并发送消息
$("#send").click(async () => { $("#send").click(async () => {
const query = $("#input").val(); const query = $("#input").val(); // 获取用户输入
console.log("query", query); if (!query) { // 如果用户输入为空,则返回
if (!query) {
return; return;
} }
$("#input").val(""); $("#input").val(""); // 清空用户输入
addMessage("user", query, Date.now()); addMessage("user", query, Date.now()); // 添加用户消息
await send(query); await send(query); // 发送消息
}); });
$("#stop").click(stop); $("#stop").click(stop); // 点击停止按钮时,停止发送消息
// 初始化。初始化幕间官方SDK
(async () => { (async () => {
await mujianSdk.init().then(async () => { await mujianSdk.init().then(async () => {
await renderAllMessages(); await renderAllMessages(); // 渲染所有消息
}); });
})(); })();