Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9098e6b4f7 | |||
| fb09560259 | |||
| 83bdab3205 |
43
www/app.js
43
www/app.js
@@ -19,6 +19,7 @@ let isLoading = false;
|
||||
// 功能开关
|
||||
let enableThinking = false; // 深度思考
|
||||
let enableSearch = false; // 联网搜索
|
||||
let autoScrollEnabled = true; // 自动滚动(用户滚动后可关闭)
|
||||
|
||||
// DOM 元素(初始为 null,在 openConversation 时重新获取)
|
||||
let appContainer = null;
|
||||
@@ -575,6 +576,12 @@ function openConversation(id) {
|
||||
thinkingBtn = document.getElementById('thinkingBtn');
|
||||
searchBtn = document.getElementById('searchBtn');
|
||||
|
||||
// 重置自动滚动状态
|
||||
autoScrollEnabled = true;
|
||||
|
||||
// 设置滚动监听
|
||||
setupScrollListener();
|
||||
|
||||
// 绑定按钮事件
|
||||
const backBtn = document.getElementById('backBtn');
|
||||
if (backBtn) backBtn.addEventListener('click', showConversationList);
|
||||
@@ -739,6 +746,9 @@ async function sendMessage() {
|
||||
currentConversation.updatedAt = Date.now();
|
||||
saveConversations();
|
||||
|
||||
// 发送新消息时启用自动滚动
|
||||
autoScrollEnabled = true;
|
||||
|
||||
renderMessages();
|
||||
userInput.value = '';
|
||||
autoResize(userInput);
|
||||
@@ -1010,7 +1020,7 @@ async function generateConversationTitle() {
|
||||
`${m.role === 'user' ? '用户' : 'AI'}: ${m.content.slice(0, 200)}`
|
||||
).join('\n');
|
||||
|
||||
const titlePrompt = `请用不超过10个字总结以下对话的主题,只输出标题,不要其他内容:
|
||||
const titlePrompt = `请用不超过20个字总结以下对话的主题,只输出标题,不要其他内容:
|
||||
${conversationText}`;
|
||||
|
||||
try {
|
||||
@@ -1023,7 +1033,8 @@ ${conversationText}`;
|
||||
body: JSON.stringify({
|
||||
model: CONFIG.model,
|
||||
messages: [{ role: 'user', content: titlePrompt }],
|
||||
max_tokens: 50
|
||||
max_tokens: 100,
|
||||
thinking: { type: 'disabled' } // 禁用思考模式,直接输出标题
|
||||
})
|
||||
});
|
||||
|
||||
@@ -1038,7 +1049,7 @@ ${conversationText}`;
|
||||
if (newTitle && newTitle.length > 0) {
|
||||
// 去掉可能的引号和多余符号
|
||||
const cleanTitle = newTitle.replace(/^["'"']+|["'"']+$/g, '').trim();
|
||||
if (cleanTitle.length > 0 && cleanTitle.length <= 20) {
|
||||
if (cleanTitle.length > 0 && cleanTitle.length <= 30) {
|
||||
currentConversation.title = cleanTitle;
|
||||
currentConversation.updatedAt = Date.now();
|
||||
saveConversations();
|
||||
@@ -1297,10 +1308,32 @@ function renderMarkdown(text) {
|
||||
return marked.parse(text);
|
||||
}
|
||||
|
||||
// 滚动到底部
|
||||
// 滚动到底部(智能滚动:只在用户已在底部时自动滚动)
|
||||
function scrollToBottom() {
|
||||
if (messagesContainer) {
|
||||
messagesContainer.scrollTop = messagesContainer.scrollHeight;
|
||||
// 判断用户是否在底部附近(距离底部100px以内)
|
||||
const isNearBottom = messagesContainer.scrollHeight - messagesContainer.scrollTop - messagesContainer.clientHeight < 100;
|
||||
|
||||
if (isNearBottom || autoScrollEnabled) {
|
||||
messagesContainer.scrollTop = messagesContainer.scrollHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 监听用户滚动行为
|
||||
function setupScrollListener() {
|
||||
if (messagesContainer) {
|
||||
messagesContainer.addEventListener('scroll', () => {
|
||||
// 判断用户是否在底部附近
|
||||
const isNearBottom = messagesContainer.scrollHeight - messagesContainer.scrollTop - messagesContainer.clientHeight < 100;
|
||||
|
||||
if (isNearBottom) {
|
||||
autoScrollEnabled = true;
|
||||
} else {
|
||||
// 用户往上滚动,停止自动滚动
|
||||
autoScrollEnabled = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<title>AI助手</title>
|
||||
<link rel="stylesheet" href="style.css?v=2.7.5">
|
||||
<link rel="stylesheet" href="style.css?v=2.8.0">
|
||||
<link rel="manifest" href="manifest.json">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script src="marked.min.js?v=2.7.5"></script>
|
||||
<script src="app.js?v=2.7.5"></script>
|
||||
<script src="marked.min.js?v=2.8.0"></script>
|
||||
<script src="app.js?v=2.8.0"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user