镜像自地址
https://github.com/binary-husky/gpt_academic.git
已同步 2025-12-06 14:36:48 +00:00
roll version to 3.91
这个提交包含在:
@@ -270,4 +270,9 @@
|
|||||||
}
|
}
|
||||||
#gpt-submit-row #gpt-submit-dropdown > *:hover {
|
#gpt-submit-row #gpt-submit-dropdown > *:hover {
|
||||||
cursor: context-menu;
|
cursor: context-menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip.svelte-p2nen8.svelte-p2nen8 {
|
||||||
|
box-shadow: 10px 10px 15px rgba(0, 0, 0, 0.5);
|
||||||
|
left: 10px;
|
||||||
}
|
}
|
||||||
110
themes/common.js
110
themes/common.js
@@ -953,26 +953,14 @@ function update_conversation_metadata() {
|
|||||||
// console.log("conversation_metadata", conversation_metadata);
|
// console.log("conversation_metadata", conversation_metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
// // Example schema for conversation data structure
|
|
||||||
// const example_conversation = {
|
|
||||||
// metadata: {
|
|
||||||
// id: "550e8400-e29b-41d4-a716-446655440000",
|
|
||||||
// timestamp: "2024-03-29T12:34:56.789Z"
|
|
||||||
// },
|
|
||||||
// conversation: [
|
|
||||||
// ["user", "Hello, how are you?"],
|
|
||||||
// ["assistant", "I'm doing well, thank you for asking! How can I help you today?"],
|
|
||||||
// ["user", "What is the weather like?"],
|
|
||||||
// ["assistant", "I don't have access to real-time weather information. You would need to check a weather service or look outside to know the current weather conditions."]
|
|
||||||
// ],
|
|
||||||
// preview: "A conversation about greetings and weather"
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Helper function to generate conversation preview
|
// Helper function to generate conversation preview
|
||||||
function generatePreview(conversation, maxLength = 100) {
|
function generatePreview(conversation, timestamp, maxLength = 100) {
|
||||||
if (!conversation || conversation.length === 0) return "";
|
if (!conversation || conversation.length === 0) return "";
|
||||||
// Join all messages with dash separator
|
// Join all messages with dash separator
|
||||||
const preview = conversation.join("\n");
|
let preview = conversation.join("\n");
|
||||||
|
const readableDate = new Date(timestamp).toLocaleString();
|
||||||
|
preview = readableDate + "\n" + preview;
|
||||||
if (preview.length <= maxLength) return preview;
|
if (preview.length <= maxLength) return preview;
|
||||||
return preview.substring(0, maxLength) + "...";
|
return preview.substring(0, maxLength) + "...";
|
||||||
}
|
}
|
||||||
@@ -990,7 +978,7 @@ async function save_conversation_history() {
|
|||||||
metadata: conversation_metadata,
|
metadata: conversation_metadata,
|
||||||
conversation: chatbot,
|
conversation: chatbot,
|
||||||
history: history,
|
history: history,
|
||||||
preview: generatePreview(JSON.parse(history))
|
preview: generatePreview(JSON.parse(history), conversation_metadata.timestamp)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get existing conversation history from local storage
|
// Get existing conversation history from local storage
|
||||||
@@ -1036,6 +1024,7 @@ async function save_conversation_history() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function restore_chat_from_local_storage(event) {
|
function restore_chat_from_local_storage(event) {
|
||||||
let conversation = event.detail;
|
let conversation = event.detail;
|
||||||
push_data_to_gradio_component(conversation.conversation, "gpt-chatbot", "obj");
|
push_data_to_gradio_component(conversation.conversation, "gpt-chatbot", "obj");
|
||||||
@@ -1053,7 +1042,6 @@ function restore_chat_from_local_storage(event) {
|
|||||||
setCookie("conversation_metadata", JSON.stringify(conversationData), 2);
|
setCookie("conversation_metadata", JSON.stringify(conversationData), 2);
|
||||||
// read from cookie
|
// read from cookie
|
||||||
let conversation_metadata = getCookie("conversation_metadata");
|
let conversation_metadata = getCookie("conversation_metadata");
|
||||||
// console.log("conversation_metadata", conversation_metadata);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1066,6 +1054,7 @@ function clear_conversation(a, b, c) {
|
|||||||
return reset_conversation(a, b);
|
return reset_conversation(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function reset_conversation(a, b) {
|
function reset_conversation(a, b) {
|
||||||
// console.log("js_code_reset");
|
// console.log("js_code_reset");
|
||||||
a = btoa(unescape(encodeURIComponent(JSON.stringify(a))));
|
a = btoa(unescape(encodeURIComponent(JSON.stringify(a))));
|
||||||
@@ -1076,6 +1065,7 @@ function reset_conversation(a, b) {
|
|||||||
return [[], [], "已重置"];
|
return [[], [], "已重置"];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// clear -> 将 history 缓存至 history_cache -> 点击复原 -> restore_previous_chat() -> 触发elem_update_history -> 读取 history_cache
|
// clear -> 将 history 缓存至 history_cache -> 点击复原 -> restore_previous_chat() -> 触发elem_update_history -> 读取 history_cache
|
||||||
function restore_previous_chat() {
|
function restore_previous_chat() {
|
||||||
// console.log("restore_previous_chat");
|
// console.log("restore_previous_chat");
|
||||||
@@ -1088,90 +1078,6 @@ function restore_previous_chat() {
|
|||||||
// document.querySelector("#elem_update_history").click(); // in order to call set_history_gr_state, and send history state to server
|
// document.querySelector("#elem_update_history").click(); // in order to call set_history_gr_state, and send history state to server
|
||||||
}
|
}
|
||||||
|
|
||||||
function gen_restore_btn() {
|
|
||||||
|
|
||||||
|
|
||||||
// 创建按钮元素
|
|
||||||
const button = document.createElement('div');
|
|
||||||
// const recvIcon = '<span><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height=".8em" width=".8em" xmlns="http://www.w3.org/2000/svg"><polyline points="20 6 9 17 4 12"></polyline></svg></span>';
|
|
||||||
const rec_svg = '<svg t="1714361184567" style="transform:translate(1px, 2.5px)" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4389" width="35" height="35"><path d="M320 512h384v64H320zM320 384h384v64H320zM320 640h192v64H320z" p-id="4390" fill="#ffffff"></path><path d="M863.7 544c-1.9 44-11.4 86.8-28.5 127.2-18.5 43.8-45.1 83.2-78.9 117-33.8 33.8-73.2 60.4-117 78.9C593.9 886.3 545.7 896 496 896s-97.9-9.7-143.2-28.9c-43.8-18.5-83.2-45.1-117-78.9-33.8-33.8-60.4-73.2-78.9-117C137.7 625.9 128 577.7 128 528s9.7-97.9 28.9-143.2c18.5-43.8 45.1-83.2 78.9-117s73.2-60.4 117-78.9C398.1 169.7 446.3 160 496 160s97.9 9.7 143.2 28.9c23.5 9.9 45.8 22.2 66.5 36.7l-119.7 20 9.9 59.4 161.6-27 59.4-9.9-9.9-59.4-27-161.5-59.4 9.9 19 114.2C670.3 123.8 586.4 96 496 96 257.4 96 64 289.4 64 528s193.4 432 432 432c233.2 0 423.3-184.8 431.7-416h-64z" p-id="4391" fill="#ffffff"></path></svg>'
|
|
||||||
const recvIcon = '<span>' + rec_svg + '</span>';
|
|
||||||
|
|
||||||
// 设置按钮的样式和属性
|
|
||||||
button.id = 'floatingButton';
|
|
||||||
button.className = 'glow';
|
|
||||||
button.style.textAlign = 'center';
|
|
||||||
button.style.position = 'fixed';
|
|
||||||
button.style.bottom = '10px';
|
|
||||||
button.style.left = '10px';
|
|
||||||
button.style.width = '50px';
|
|
||||||
button.style.height = '50px';
|
|
||||||
button.style.borderRadius = '50%';
|
|
||||||
button.style.backgroundColor = '#007bff';
|
|
||||||
button.style.color = 'white';
|
|
||||||
button.style.display = 'flex';
|
|
||||||
button.style.alignItems = 'center';
|
|
||||||
button.style.justifyContent = 'center';
|
|
||||||
button.style.cursor = 'pointer';
|
|
||||||
button.style.transition = 'all 0.3s ease';
|
|
||||||
button.style.boxShadow = '0 0 10px rgba(0,0,0,0.2)';
|
|
||||||
|
|
||||||
button.innerHTML = recvIcon;
|
|
||||||
|
|
||||||
// 添加发光动画的关键帧
|
|
||||||
const styleSheet = document.createElement('style');
|
|
||||||
styleSheet.id = 'floatingButtonStyle';
|
|
||||||
styleSheet.innerText = `
|
|
||||||
@keyframes glow {
|
|
||||||
from {
|
|
||||||
box-shadow: 0 0 10px rgba(0,0,0,0.2);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
box-shadow: 0 0 13px rgba(0,0,0,0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#floatingButton.glow {
|
|
||||||
animation: glow 1s infinite alternate;
|
|
||||||
}
|
|
||||||
#floatingButton:hover {
|
|
||||||
transform: scale(1.2);
|
|
||||||
box-shadow: 0 0 20px rgba(0,0,0,0.4);
|
|
||||||
}
|
|
||||||
#floatingButton.disappearing {
|
|
||||||
animation: shrinkAndDisappear 0.5s forwards;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
// only add when not exist
|
|
||||||
if (!document.getElementById('recvButtonStyle')) {
|
|
||||||
document.head.appendChild(styleSheet);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 鼠标悬停和移开的事件监听器
|
|
||||||
button.addEventListener('mouseover', function () {
|
|
||||||
this.textContent = "还原\n对话";
|
|
||||||
});
|
|
||||||
|
|
||||||
button.addEventListener('mouseout', function () {
|
|
||||||
this.innerHTML = recvIcon;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 点击事件监听器
|
|
||||||
button.addEventListener('click', function () {
|
|
||||||
// 添加一个类来触发缩小和消失的动画
|
|
||||||
restore_previous_chat();
|
|
||||||
this.classList.add('disappearing');
|
|
||||||
// 在动画结束后移除按钮
|
|
||||||
document.body.removeChild(this);
|
|
||||||
});
|
|
||||||
// only add when not exist
|
|
||||||
if (!document.getElementById('recvButton')) {
|
|
||||||
document.body.appendChild(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将按钮添加到页面中
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
async function on_plugin_exe_complete(fn_name) {
|
async function on_plugin_exe_complete(fn_name) {
|
||||||
// console.log(fn_name);
|
// console.log(fn_name);
|
||||||
|
|||||||
在新工单中引用
屏蔽一个用户