1147 lines
46 KiB
HTML
1147 lines
46 KiB
HTML
<!DOCTYPE html>
|
||
<html
|
||
lang="en-US"
|
||
class="light-style"
|
||
>
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta
|
||
name="viewport"
|
||
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"
|
||
/>
|
||
|
||
<title>Top - SisAi world</title>
|
||
|
||
<meta name="description" id="site_desc" content="" />
|
||
|
||
<!-- Favicon -->
|
||
<link rel="icon" type="image/x-icon" href="files/favicon.ico" />
|
||
|
||
<!-- Fonts -->
|
||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||
<link
|
||
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap"
|
||
rel="stylesheet"
|
||
/>
|
||
|
||
<!-- Icons. Uncomment required icon fonts -->
|
||
<link rel="stylesheet" href="files/boxicons.css" />
|
||
|
||
<!-- Core CSS -->
|
||
<link rel="stylesheet" href="files/core.css" class="template-customizer-core-css" />
|
||
<link rel="stylesheet" href="files/theme-default.css" class="template-customizer-theme-css" />
|
||
<link rel="stylesheet" href="files/demo.css" />
|
||
|
||
<!-- Vendors CSS -->
|
||
<link rel="stylesheet" href="files/perfect-scrollbar.css" />
|
||
|
||
<script src="files/jquery.js"></script>
|
||
|
||
<!-- Helpers -->
|
||
<script src="files/helpers.js"></script>
|
||
|
||
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
|
||
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
|
||
<script src="files/config.js"></script>
|
||
|
||
<script src="files/ua-parser.js"></script>
|
||
|
||
<link rel="stylesheet" href="files/spinner.css" />
|
||
<script src="files/amipro_utils.js?v=20230401402"></script>
|
||
|
||
<script src="files/portal.js?v=2023082705"></script>
|
||
|
||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||
|
||
<style>
|
||
.container {
|
||
flex: 1;
|
||
overflow-y: auto;
|
||
padding: 10px;
|
||
border-top: 1px solid #000;
|
||
border-bottom: 1px solid #000;
|
||
}
|
||
|
||
#toTopBtn {
|
||
position: fixed;
|
||
bottom: 60px;
|
||
right: 20px;
|
||
background-color: rgb(3, 195, 236);
|
||
color: white; /* White text */
|
||
border: none;
|
||
border-radius: 50%;
|
||
padding: 15px 15px;
|
||
font-size: 16px;
|
||
cursor: pointer;
|
||
/*box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);*/
|
||
box-shadow: -5px 5px 20px rgba(69, 65, 78, 0.21);
|
||
z-index: 1000; /* Ensures the button is on top of other elements */
|
||
}
|
||
|
||
#toTopBtn:hover {
|
||
background-color: #0056b3; /* Darker blue on hover */
|
||
}
|
||
|
||
</style>
|
||
|
||
<script>
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Input question");
|
||
lang_map.set("zh-CN", "输入问题");
|
||
lang_map.set("ja", "質問を入力してください");
|
||
i18n_messages.set("label_question", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "My questions");
|
||
lang_map.set("zh-CN", "我的问题");
|
||
lang_map.set("ja", "私の質問");
|
||
i18n_messages.set("label_history_questions", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Ask question");
|
||
lang_map.set("zh-CN", "提 问");
|
||
lang_map.set("ja", "質 問");
|
||
i18n_messages.set("btn_ask", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Stop");
|
||
lang_map.set("zh-CN", "停 止");
|
||
lang_map.set("ja", "停 止");
|
||
i18n_messages.set("btn_stop", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Max length is 1000 characters");
|
||
lang_map.set("zh-CN", "最大长度为1000个字");
|
||
lang_map.set("ja", "最大長さは1000文字です");
|
||
i18n_messages.set("msg_question", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Search...");
|
||
lang_map.set("zh-CN", "搜索...");
|
||
lang_map.set("ja", "検索...");
|
||
i18n_messages.set("label_search", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Input question, please");
|
||
lang_map.set("zh-CN", "请输入问题");
|
||
lang_map.set("ja", "質問を入力してください");
|
||
i18n_messages.set("msg_input_question", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Question is too long");
|
||
lang_map.set("zh-CN", "问题太长了");
|
||
lang_map.set("ja", "質問が長すぎます");
|
||
i18n_messages.set("msg_toolong_question", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Register link");
|
||
lang_map.set("zh-CN", "用户注册链接");
|
||
lang_map.set("ja", "ユーザー登録リンク");
|
||
i18n_messages.set("title_reg_link", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Users can register their devices by clicking this link without authentication. Please send this link to users with a secure method. The link will be expired in 15 minutes.\n(Link has been copied to clipboard)");
|
||
lang_map.set("zh-CN", "用户可以无需进行身份验证即可通过点击此链接而注册其设备。请通过安全的方式将此链接发送给用户。链接将在15分钟后过期。\n(链接已经拷贝至剪贴板)");
|
||
lang_map.set("ja", "ユーザーは、このリンクをクリックすることで、認証なしにデバイスを登録できます。このリンクを安全な方法でユーザーに送信してください。リンクは15分で期限切れになります。\n(リンクはクリップボードにコピーされました)");
|
||
i18n_messages.set("msg_link", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Devices");
|
||
lang_map.set("zh-CN", "设备");
|
||
lang_map.set("ja", "デバイス");
|
||
i18n_messages.set("btn_devices", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Are you sure to delete this account?");
|
||
lang_map.set("zh-CN", "确定要删除此账户吗?");
|
||
lang_map.set("ja", "このアカウントを削除してもよろしいですか?");
|
||
i18n_messages.set("msg_del_account", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Are you sure to logout this account?");
|
||
lang_map.set("zh-CN", "确定要登出此账户吗?");
|
||
lang_map.set("ja", "このアカウントをログアウトしてもよろしいですか?");
|
||
i18n_messages.set("msg_logout_user", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("zh-CN", "因参考及使用本网站而产生的任何后果,本网站及运用公司不承担任何责任。");
|
||
lang_map.set("ja", "このウェブサイトの参照および使用によって生じたいかなる結果についても、このウェブサイトおよび運用会社は一切の責任を負いません。");
|
||
lang_map.set("en-US", "This website and the operating company shall not be responsible for any consequences arising from the reference and use of this website.");
|
||
i18n_messages.set("msg_warning", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "[Open new Conversation]");
|
||
lang_map.set("zh-CN", "<新建对话>");
|
||
lang_map.set("ja", "<新会話開始>");
|
||
i18n_messages.set("btn_new_conv", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Are you sure to delete this device?");
|
||
lang_map.set("zh-CN", "确定要删除此设备吗?");
|
||
lang_map.set("ja", "このデバイスを削除してもよろしいですか?");
|
||
i18n_messages.set("msg_del_device", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Delete");
|
||
lang_map.set("zh-CN", "删除");
|
||
lang_map.set("ja", "削除");
|
||
i18n_messages.set("btn_delete", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Failed to delete device");
|
||
lang_map.set("zh-CN", "删除设备失败");
|
||
lang_map.set("ja", "デバイスの削除に失敗しました");
|
||
i18n_messages.set("msg_del_dvc_fail", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Failed to delete account");
|
||
lang_map.set("zh-CN", "删除账户失败");
|
||
lang_map.set("ja", "アカウントの削除に失敗しました");
|
||
i18n_messages.set("msg_del_acc_fail", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "System error. Please try later.");
|
||
lang_map.set("zh-CN", "系统错误,请稍后再试。");
|
||
lang_map.set("ja", "システムエラー。後でもう一度お試しください。");
|
||
i18n_messages.set("msg_sys_fail", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "No devices");
|
||
lang_map.set("zh-CN", "尚无设备");
|
||
lang_map.set("ja", "デバイスなし");
|
||
i18n_messages.set("msg_no_device", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Loading more");
|
||
lang_map.set("zh-CN", "加载更多");
|
||
lang_map.set("ja", "もっと");
|
||
i18n_messages.set("title_list_more", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Add User");
|
||
lang_map.set("zh-CN", "添加用户");
|
||
lang_map.set("ja", "ユーザーを追加");
|
||
i18n_messages.set("btn_add_user", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Add to domain");
|
||
lang_map.set("zh-CN", "添加到域");
|
||
lang_map.set("ja", "追加ドメイン");
|
||
i18n_messages.set("label_sel_user_domain", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "User ID");
|
||
lang_map.set("zh-CN", "用户ID");
|
||
lang_map.set("ja", "ユーザーID");
|
||
i18n_messages.set("label_user_id", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Display name");
|
||
lang_map.set("zh-CN", "显示名称");
|
||
lang_map.set("ja", "表示名");
|
||
i18n_messages.set("label_user_display", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Users can register their account by clicking this link. Please send this link to users with a secure method. The link will be expired in 15 minutes.\n(Link has been copied to clipboard)");
|
||
lang_map.set("zh-CN", "用户可通过点击此链接而注册账户。请通过安全的方式将此链接发送给用户。链接将在15分钟后过期。\n(链接已经拷贝至剪贴板)");
|
||
lang_map.set("ja", "ユーザーは、このリンクをクリックすることで、アカウントを登録できます。このリンクを安全な方法でユーザーに送信してください。リンクは15分で期限切れになります。\n(リンクはクリップボードにコピーされました)");
|
||
i18n_messages.set("msg_user_link", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Please input user ID");
|
||
lang_map.set("zh-CN", "请输入用户ID");
|
||
lang_map.set("ja", "ユーザーIDを入力してください");
|
||
i18n_messages.set("msg_user_id_empty", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Please input user display name");
|
||
lang_map.set("zh-CN", "请输入用户显示名");
|
||
lang_map.set("ja", "ユーザー表示名を入力してください");
|
||
i18n_messages.set("msg_user_display_empty", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Logout");
|
||
lang_map.set("zh-CN", "登 出");
|
||
lang_map.set("ja", "ログアウト");
|
||
i18n_messages.set("btn_logout_account", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Fail to logout user");
|
||
lang_map.set("zh-CN", "登出用户失败");
|
||
lang_map.set("ja", "ユーザーのログアウトに失敗しました");
|
||
i18n_messages.set("msg_logout_fail", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "Recommended Questions");
|
||
lang_map.set("zh-CN", "推荐问题");
|
||
lang_map.set("ja", "おすすめの質問");
|
||
i18n_messages.set("label_advices", lang_map);
|
||
|
||
lang_map = new Map();
|
||
lang_map.set("en-US", "[Please select]");
|
||
lang_map.set("zh-CN", "<请选择>");
|
||
lang_map.set("ja", "<選択してください>");
|
||
i18n_messages.set("label_please_select", lang_map);
|
||
|
||
var advice_prompts = [];
|
||
var my_prompts = [];
|
||
|
||
$(async function(){
|
||
$("#user_nickname").text(sessionStorage.getItem("nickname")?sessionStorage.getItem("nickname"):"");
|
||
|
||
showSpinner();
|
||
|
||
await listSpaces();
|
||
if(document.getElementById("sel_space").childElementCount == 0){
|
||
window.location.href = "market.html";
|
||
return;
|
||
}
|
||
|
||
await changedSpace();
|
||
|
||
await changedConversation();
|
||
|
||
|
||
const toTopBtn = document.getElementById("toTopBtn");
|
||
toTopBtn.addEventListener("click", function() {
|
||
window.scrollTo({top: 0, behavior: 'smooth'});
|
||
});
|
||
|
||
|
||
hideSpinner();
|
||
});
|
||
|
||
function isMobile(){
|
||
return /Mobi|Android/i.test(navigator.userAgent);
|
||
}
|
||
|
||
async function listSpaces(sel_space_id){
|
||
try{
|
||
var response = await fetch("/listspacenms", {
|
||
method: "POST",
|
||
cache: "no-cache",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
}
|
||
});
|
||
|
||
if (response.status == 200) {
|
||
json = await response.json();
|
||
if (json.status == "OK") {
|
||
var sel_space = document.getElementById("sel_space");
|
||
for (var i = 0; i < json.spaces.length; i++) {
|
||
var opt = document.createElement("option");
|
||
if (sel_space_id && sel_space_id == json.spaces[i].space_id) {
|
||
opt.selected = true;
|
||
} else if (!sel_space_id && i == 0) {
|
||
opt.selected = true;
|
||
}
|
||
opt.value = json.spaces[i].space_id;
|
||
opt.innerHTML = getI18NJsonText(json.spaces[i].space_name);
|
||
sel_space.appendChild(opt);
|
||
}
|
||
} else {
|
||
//redirect to login page
|
||
window.location.href = "/login.html";
|
||
return;
|
||
}
|
||
} else if (response.status == 440) {
|
||
window.location.href = "/login.html";
|
||
}
|
||
}catch(err){
|
||
alert(getI18NText(i18n_messages, 'msg_sys_err'));
|
||
}finally{
|
||
hideSpinner();
|
||
}
|
||
}
|
||
|
||
/*async function listConersations(space_id, sel_conversation_id){
|
||
try{
|
||
var response = await fetch("/listconv", {
|
||
method: "POST",
|
||
cache: "no-cache",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify({"space_id": space_id})
|
||
});
|
||
|
||
if (response.status == 200) {
|
||
json = await response.json();
|
||
if (json.status == "OK") {
|
||
var sel_conversation = document.getElementById("sel_conversation");
|
||
sel_conversation.innerHTML = "";
|
||
|
||
if(json.convs.length == 0){
|
||
//Hide conversation select
|
||
sel_conversation.style.display = "none";
|
||
return;
|
||
}else{
|
||
sel_conversation.style.display = "block";
|
||
}
|
||
|
||
for (var i = 0; i < json.convs.length; i++) {
|
||
var opt = document.createElement("option");
|
||
if (sel_conversation_id && sel_conversation_id == json.convs[i].id) {
|
||
opt.selected = true;
|
||
} else if (!sel_conversation_id && i == 0) {
|
||
opt.selected = true;
|
||
}
|
||
opt.value = json.convs[i].id;
|
||
opt.innerHTML = getI18NJsonText(json.convs[i].name);
|
||
sel_conversation.appendChild(opt);
|
||
}
|
||
var opt = document.createElement("option");
|
||
opt.value = "-new-";
|
||
opt.innerHTML = getI18NText(i18n_messages, "btn_new_conv");
|
||
sel_conversation.appendChild(opt);
|
||
|
||
}
|
||
} else if (response.status == 440) {
|
||
window.location.href = "/login.html";
|
||
}
|
||
}catch(err){
|
||
alert(getI18NText(i18n_messages, 'msg_sys_err'));
|
||
}finally{
|
||
hideSpinner();
|
||
}
|
||
}*/
|
||
|
||
async function changedSpace(){
|
||
var space_id = document.getElementById("sel_space").value;
|
||
var lstJson = {
|
||
"space_id": space_id,
|
||
"language": window.navigator.language
|
||
};
|
||
|
||
document.getElementById("sel_rcm_question").innerHTML = "";
|
||
document.getElementById("sel_my_prompts").innerHTML = "";
|
||
document.getElementById("scroll_div").innerHTML = "";
|
||
document.getElementById("sel_conversation").innerHTML = "";
|
||
document.getElementById("input_question").value = "";
|
||
|
||
try{
|
||
var response = await fetch("/getspace", {
|
||
method: "POST",
|
||
cache: "no-cache",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify(lstJson)
|
||
});
|
||
|
||
if (response.status == 200) {
|
||
response.json().then(function (data) {
|
||
if (data.status == "OK") {
|
||
if(data.prompts && data.prompts.length > 0){
|
||
var sel_info = document.getElementById("sel_rcm_question");
|
||
if(isMobile()){
|
||
opt = document.createElement("option");
|
||
opt.value = '-select-';
|
||
opt.innerHTML = getI18NText(i18n_messages, "label_please_select");
|
||
opt.selected = true;
|
||
sel_info.appendChild(opt);
|
||
}
|
||
advice_prompts = data.prompts;
|
||
advice_prompts.forEach(function (prompt) {
|
||
var opt = document.createElement("option");
|
||
opt.value = prompt.prompt_id;
|
||
opt.innerHTML = prompt.prompt_show.substring(0, 50);
|
||
sel_info.appendChild(opt);
|
||
});
|
||
}
|
||
if(data.my_prompts){
|
||
var sel_info = document.getElementById("sel_my_prompts");
|
||
if(isMobile()){
|
||
opt = document.createElement("option");
|
||
opt.value = '-select-';
|
||
opt.innerHTML = getI18NText(i18n_messages, "label_please_select");
|
||
opt.selected = true;
|
||
sel_info.appendChild(opt);
|
||
}
|
||
my_prompts = data.my_prompts;
|
||
my_prompts.forEach(function (prompt) {
|
||
var opt = document.createElement("option");
|
||
opt.innerHTML = prompt.substring(0, 50);
|
||
sel_info.appendChild(opt);
|
||
});
|
||
}
|
||
var sel_conversation = document.getElementById("sel_conversation");
|
||
if(data.convs){//} && data.convs.length > 0){
|
||
data.convs.forEach(function (conv) {
|
||
var opt = document.createElement("option");
|
||
opt.value = conv.id;
|
||
opt.innerHTML = getI18NJsonText(conv.name);
|
||
sel_conversation.appendChild(opt);
|
||
});
|
||
}
|
||
/*else if(!data.convs || data.convs.length == 0){
|
||
//Hide conversation select
|
||
sel_conversation.style.display = "none";
|
||
}*/
|
||
var opt = document.createElement("option");
|
||
opt.value = "-new-";
|
||
opt.innerHTML = getI18NText(i18n_messages, "btn_new_conv");
|
||
sel_conversation.appendChild(opt);
|
||
sel_conversation.selectedIndex = sel_conversation.options.length - 1;
|
||
} else {
|
||
//redirect to login page
|
||
window.location.href = "/login.html";
|
||
return;
|
||
}
|
||
});
|
||
} else if (response.status == 440) {
|
||
window.location.href = "/login.html";
|
||
}
|
||
}catch(err){
|
||
alert(getI18NText(i18n_messages, 'msg_sys_err'));
|
||
}finally{
|
||
hideSpinner();
|
||
}
|
||
}
|
||
|
||
function adjustQuestionTextareaHeight() {
|
||
var textarea = document.getElementById("input_question");
|
||
textarea.style.height = 'auto';
|
||
textarea.style.height = textarea.scrollHeight + 'px';
|
||
}
|
||
|
||
async function changedConversation(){
|
||
var lstJson = {
|
||
"space_id": document.getElementById("sel_space").value,
|
||
"conversation_id": document.getElementById("sel_conversation").value,
|
||
"language": window.navigator.language
|
||
};
|
||
|
||
document.getElementById("scroll_div").innerHTML = "";
|
||
|
||
if(lstJson.conversation_id == "-new-"){
|
||
document.getElementById("input_question").value = "";
|
||
document.getElementById("msg_hint").innerHTML = "";
|
||
adjustQuestionTextareaHeight();
|
||
return;
|
||
}
|
||
try{
|
||
var response = await fetch("/listhistory", {
|
||
method: "POST",
|
||
cache: "no-cache",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify(lstJson)
|
||
});
|
||
|
||
if (response.status == 200) {
|
||
response.json().then(function (data) {
|
||
if (data.status == "OK") {
|
||
if(data.history){
|
||
var scrollDiv = document.getElementById("scroll_div");
|
||
scrollDiv.innerHTML = "";
|
||
data.history.forEach(function (history) {
|
||
const txt = history.prompt?history.prompt.replace(/\n/g, "<br>"):'';
|
||
const answer_txt = history.answer?history.answer.replace(/\n/g, "<br>"):'';
|
||
scrollDiv.innerHTML +=
|
||
`<div class="card" style="margin-top:5pt;">
|
||
<div class="card-header d-flex align-items-center justify-content-between">
|
||
<h6 class="card-title m-0 me-2">`+txt+
|
||
`</h6>[`+history.created+`]</div><div class="card-body">`+marked.parse(answer_txt)+`</div></div>`;
|
||
});
|
||
}
|
||
} else {
|
||
//redirect to login page
|
||
window.location.href = "/login.html";
|
||
return;
|
||
}
|
||
});
|
||
} else if (response.status == 440) {
|
||
window.location.href = "/login.html";
|
||
}
|
||
}catch(err){
|
||
alert(getI18NText(i18n_messages, 'msg_sys_err'));
|
||
}finally{
|
||
hideSpinner();
|
||
}
|
||
}
|
||
|
||
async function newConversation(space_id, prompt){
|
||
try{
|
||
var response = await fetch("/newconversation", {
|
||
method: "POST",
|
||
cache: "no-cache",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify({"space_id": space_id, "prompt": prompt, "language": window.navigator.language})
|
||
});
|
||
|
||
if(response.status == 200){
|
||
json = await response.json();
|
||
if(json.status == "OK"){
|
||
const sel_conversation = document.getElementById("sel_conversation");
|
||
const opt = document.createElement("option");
|
||
opt.value = json.conv_id;
|
||
opt.innerHTML = getI18NJsonText(json.short_name);
|
||
//Insert option next bottom of sel_conversation
|
||
sel_conversation.insertBefore(opt, sel_conversation.options[sel_conversation.options.length - 1]);
|
||
sel_conversation.selectedIndex = sel_conversation.options.length - 2;
|
||
}
|
||
}else if(response.status == 440){
|
||
window.location.href = "/login.html";
|
||
}
|
||
}catch(err){
|
||
alert(getI18NText(i18n_messages, 'msg_sys_err'));
|
||
}finally{
|
||
hideSpinner();
|
||
}
|
||
}
|
||
|
||
function clickedQuestion(elem) {
|
||
//var obj = document.getElementById(elem);
|
||
document.getElementById("msg_hint").innerHTML = "";
|
||
var sel = elem.options[elem.selectedIndex];
|
||
//alert(elem.id+':'+elem.selectedIndex+":"+sel.value+":"+sel.text + ":" + sel.innerHTML);
|
||
if (sel && sel.value.length > 0) {
|
||
var sel_idx = isMobile()?elem.selectedIndex-1:elem.selectedIndex;
|
||
/*if(elem.options[0].value == '-select-'){
|
||
sel_idx--;
|
||
}*/
|
||
if (elem.id == "sel_rcm_question") {
|
||
document.getElementById("input_question").value = advice_prompts[sel_idx].prompt_show;
|
||
document.getElementById("msg_hint").innerHTML = advice_prompts[sel_idx].prompt_hint;
|
||
} else {
|
||
document.getElementById("input_question").value = my_prompts[sel_idx];
|
||
|
||
const advice_idx = findAdviceIndex(sel.text);
|
||
if (advice_idx >= 0 && advice_prompts[advice_idx].prompt_hint) {
|
||
document.getElementById("msg_hint").innerHTML = advice_prompts[advice_idx].prompt_hint;
|
||
}
|
||
}
|
||
adjustQuestionTextareaHeight();
|
||
}
|
||
if(isMobile()){
|
||
elem.selectedIndex = 0;
|
||
}else{
|
||
elem.selectedIndex = -1;
|
||
}
|
||
}
|
||
|
||
function findAdviceIndex(prompt_text){
|
||
for(var i = 0; i < advice_prompts.length; i++){
|
||
if(advice_prompts[i].prompt_show == prompt_text){
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
async function sendAsk(){
|
||
document.getElementById("btn_ask").setAttribute("disabled", "disabled");
|
||
|
||
var question = document.getElementById("input_question").value;
|
||
if(question.length == 0){
|
||
alert(getI18NText(i18n_messages, "msg_input_question"));
|
||
document.getElementById("btn_ask").removeAttribute("disabled");
|
||
return;
|
||
}
|
||
if(question.length > 1000){
|
||
alert(getI18NText(i18n_messages, "msg_toolong_question"));
|
||
document.getElementById("btn_ask").removeAttribute("disabled");
|
||
return;
|
||
}
|
||
try{
|
||
if(document.getElementById("btn_ask").innerText == getI18NText(i18n_messages, "btn_stop")){
|
||
document.getElementById("btn_ask").innerText = getI18NText(i18n_messages, "btn_ask");
|
||
document.getElementById("btn_ask").classList.remove("btn-danger");
|
||
document.getElementById("btn_ask").classList.add("btn-info");
|
||
var response = await fetch("/stop", {
|
||
method: "POST",
|
||
cache: "no-cache",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify({"time": Date.now()})
|
||
});
|
||
document.getElementById("btn_ask").removeAttribute("disabled");
|
||
|
||
return;
|
||
}else{
|
||
document.getElementById("btn_ask").innerText = getI18NText(i18n_messages, "btn_stop");
|
||
document.getElementById("btn_ask").classList.remove("btn-primary");
|
||
document.getElementById("btn_ask").classList.add("btn-danger");
|
||
}
|
||
|
||
if(document.getElementById("sel_conversation").style.display == "none" ||
|
||
document.getElementById("sel_conversation").value == "-new-") {
|
||
await newConversation(document.getElementById("sel_space").value, question);
|
||
document.getElementById("sel_conversation").style.display = "block";
|
||
}
|
||
|
||
json = {
|
||
"space_id": document.getElementById("sel_space").value,
|
||
"question": question,
|
||
"language": window.navigator.language,
|
||
"time": Date.now()
|
||
};
|
||
const advice_prompt= mostSimilarAdvicePromptId(question);
|
||
if(advice_prompt.equal || advice_prompt.rate > 0.8){
|
||
json["advice_prompt_id"] = advice_prompt.id;
|
||
}
|
||
if(!advice_prompt.equal && my_prompts.indexOf(question) < 0){
|
||
json["new_my_prompt"] = true;
|
||
//insert option into top of sel_my_prompts
|
||
var sel_info = document.getElementById("sel_my_prompts");
|
||
var opt = document.createElement("option");
|
||
opt.innerHTML = question.substring(0, 50);
|
||
sel_info.insertBefore(opt, sel_info.firstChild);
|
||
my_prompts.unshift(question);
|
||
}
|
||
/*var sel_info = document.getElementById("sel_rcm_question");
|
||
sel_info.options.forEach(function(opt){
|
||
if(similarTexts(question, opt.text, 0.8)){
|
||
json["prompt_id"] = opt.value;
|
||
}
|
||
if(opt.text == question){
|
||
sel_info.removeChild(opt);
|
||
}
|
||
});*/
|
||
const txt = question.replace(/\n/g, "<br>");
|
||
const answer_id = "answer_" + Date.now();
|
||
const scrollDiv = document.getElementById("scroll_div");
|
||
scrollDiv.innerHTML =
|
||
`<div class="card" style="margin-top:5pt;">
|
||
<div class="card-header d-flex align-items-center justify-content-between">
|
||
<h6 class="card-title m-0 me-2">`+txt+
|
||
`</h6></div><div class="card-body" id="`+answer_id+`"></div></div>`
|
||
+ scrollDiv.innerHTML ;
|
||
const output = document.getElementById(answer_id);
|
||
|
||
json["conversation_id"] = document.getElementById("sel_conversation").value;
|
||
|
||
document.getElementById("btn_ask").removeAttribute("disabled");
|
||
showSpinner();
|
||
response = await fetch("/ask", {
|
||
method: "POST",
|
||
cache: "no-cache",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify(json)
|
||
});
|
||
|
||
if(response.status == 200){
|
||
hideSpinner();
|
||
const reader = response.body.getReader();
|
||
const decoder = new TextDecoder('utf-8');
|
||
|
||
while (true){
|
||
const { done, value } = await reader.read();
|
||
if (done) break;
|
||
|
||
const text = decoder.decode(value, { stream: true });
|
||
|
||
const mktext = text.replace(/\n/g, "<br>");
|
||
output.innerHTML += mktext;
|
||
}
|
||
output.innerHTML = marked.parse(output.innerHTML);
|
||
}else if(response.status == 440){
|
||
window.location.href = "/login.html";
|
||
}
|
||
document.getElementById("btn_ask").innerText = getI18NText(i18n_messages, "btn_ask");
|
||
document.getElementById("btn_ask").classList.remove("btn-danger");
|
||
document.getElementById("btn_ask").classList.add("btn-info");
|
||
document.getElementById("input_question").value = "";
|
||
adjustQuestionTextareaHeight();
|
||
hideSpinner();
|
||
}catch(err){
|
||
alert(getI18NText(i18n_messages, 'msg_sys_err'));
|
||
}finally{
|
||
hideSpinner();
|
||
}
|
||
}
|
||
|
||
function similarTexts(text1, text2, rate){
|
||
var same = 0;
|
||
for(var i = 0; i < text1.length; i++){
|
||
if(text2.indexOf(text1[i]) >= 0){
|
||
same++;
|
||
}
|
||
}
|
||
return same >= text1.length * rate;
|
||
}
|
||
|
||
function similarAdvicePromptId(prompt){
|
||
for(var i = 0; i < advice_prompts.length; i++){
|
||
if(similarTexts(prompt, advice_prompts[i].prompt_show, 0.8)){
|
||
return advice_prompts[i].prompt_id;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function mostSimilarAdvicePromptId(prompt){
|
||
var max = 0, rate = 0;
|
||
var max_id = null;
|
||
for(var i = 0; i < advice_prompts.length; i++){
|
||
if(advice_prompts[i].prompt_show == prompt){
|
||
return {"id":advice_prompts[i].prompt_id, "equal":true};
|
||
}
|
||
|
||
var same = 0;
|
||
for(var j = 0; j < prompt.length; j++){
|
||
if(advice_prompts[i].prompt_show.indexOf(prompt[j]) >= 0){
|
||
same++;
|
||
}
|
||
}
|
||
if(same > max){
|
||
max = same;
|
||
max_id = advice_prompts[i].prompt_id;
|
||
rate = same/prompt.length;
|
||
}
|
||
}
|
||
return {"id":max_id, "equal":false, "rate":rate};
|
||
}
|
||
|
||
//Copy text to clipboard
|
||
function copyToClipboard(text) {
|
||
setTimeout(function(){
|
||
var dummy = document.createElement("textarea");
|
||
document.body.appendChild(dummy);
|
||
dummy.value = text;
|
||
dummy.select();
|
||
document.execCommand("copy");
|
||
document.body.removeChild(dummy);
|
||
}, 300);
|
||
}
|
||
|
||
function showSpinner() {
|
||
$('#sel_space').prop('disabled', true);
|
||
document.getElementById("spinner").style.display = "block";
|
||
}
|
||
|
||
function hideSpinner() {
|
||
$('#sel_space').prop('disabled', false);
|
||
document.getElementById("spinner").style.display = "none";
|
||
}
|
||
</script>
|
||
</head>
|
||
|
||
<body>
|
||
<!-- Layout wrapper -->
|
||
<div class="layout-wrapper layout-content-navbar">
|
||
<div class="layout-container">
|
||
<!-- Menu -->
|
||
|
||
<aside id="layout-menu" class="layout-menu menu-vertical menu bg-menu-theme">
|
||
<div class="app-brand demo">
|
||
<a href="top.html" class="app-brand-link">
|
||
<span class="app-brand-logo demo">
|
||
<img src="files/favicon.ico" alt="SisAi" width="45%" style="display: block; margin: 10%;" />
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="menu-inner-shadow"></div>
|
||
|
||
<ul class="menu-inner py-1">
|
||
<li class="menu-item active">
|
||
<a href="top.html" class="menu-link" onclick="javascript:return false;">
|
||
<i class="menu-icon tf-icons bx bx-home-circle"></i>
|
||
<div data-i18n="Analytics" id="menu_conversation">Conversation</div>
|
||
</a>
|
||
</li>
|
||
|
||
<li class="menu-item">
|
||
<a href="settings.html" class="menu-link">
|
||
<i class="menu-icon tf-icons bx bx-cog"></i>
|
||
<div data-i18n="Analytics" id="menu_settings">Settings</div>
|
||
</a>
|
||
</li>
|
||
|
||
<li class="menu-item">
|
||
<a href="market.html" class="menu-link">
|
||
<i class="menu-icon tf-icons bx bx-store-alt"></i>
|
||
<div data-i18n="Analytics" id="menu_market">market</div>
|
||
</a>
|
||
</li>
|
||
<li class="menu-item">
|
||
<a href="builder.html" class="menu-link">
|
||
<i class="menu-icon tf-icons bx bx-wrench"></i>
|
||
<div data-i18n="Analytics" id="menu_builder">Space Builder</div>
|
||
</a>
|
||
</li>
|
||
<li class="menu-item">
|
||
<a href="mgr.html" class="menu-link">
|
||
<i class="menu-icon tf-icons bx bx-user"></i>
|
||
<div data-i18n="Analytics" id="menu_mgr">Managers</div>
|
||
</a>
|
||
</li>
|
||
<li class="menu-item">
|
||
<a href="docs.html" class="menu-link">
|
||
<i class="menu-icon tf-icons bx bx-file"></i>
|
||
<div data-i18n="Analytics" id="menu_docs">Documents</div>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</aside>
|
||
<!-- / Menu -->
|
||
|
||
<!-- Layout container -->
|
||
<div class="layout-page">
|
||
<!-- Navbar -->
|
||
|
||
<nav
|
||
class="layout-navbar container-xxl navbar navbar-expand-xl navbar-detached align-items-center bg-navbar-theme"
|
||
id="layout-navbar"
|
||
>
|
||
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none">
|
||
<a class="nav-item nav-link px-0 me-xl-4" href="javascript:void(0)">
|
||
<i class="bx bx-menu bx-sm"></i>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="navbar-nav-right d-flex align-items-center" id="navbar-collapse">
|
||
<div class="navbar-nav align-items-center">
|
||
<div class="nav-item d-flex align-items-center">
|
||
<select class="form-select" id="sel_space" aria-label="selected space" onchange="changedSpace();">
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="navbar-nav align-items-center" style="margin-left:10pt;">
|
||
<div class="nav-item d-flex align-items-center">
|
||
<select class="form-select" id="sel_conversation" aria-label="selected Conversation" onchange="changedConversation();">
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<ul class="navbar-nav flex-row align-items-center ms-auto">
|
||
<!-- User -->
|
||
<li class="nav-item navbar-dropdown dropdown-user dropdown">
|
||
<a class="nav-link dropdown-toggle hide-arrow" href="javascript:void(0);" data-bs-toggle="dropdown">
|
||
<div class="avatar avatar-online">
|
||
<img src="files/avatar.png" alt class="w-px-40 h-auto rounded-circle" />
|
||
</div>
|
||
</a>
|
||
<ul class="dropdown-menu dropdown-menu-end">
|
||
<li>
|
||
<a class="dropdown-item" href="#">
|
||
<div class="d-flex">
|
||
<div class="flex-shrink-0 me-3">
|
||
<div class="avatar avatar-online">
|
||
<img src="files/avatar.png" alt class="w-px-40 h-auto rounded-circle" />
|
||
</div>
|
||
</div>
|
||
<div class="flex-grow-1">
|
||
<span class="fw-semibold d-block" id="user_nickname">A manager</span>
|
||
<!-- small class="text-muted">Admin</!-->
|
||
</div>
|
||
</div>
|
||
</a>
|
||
</li>
|
||
<!--li>
|
||
<div class="dropdown-divider"></div>
|
||
</!--li>
|
||
<li>
|
||
<a class="dropdown-item" href="devices.html">
|
||
<i class="bx bx-mobile-alt me-2"></i>
|
||
<span class="align-middle" id="label_device_mng">Device management</span>
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a class="dropdown-item" href="#">
|
||
<span class="d-flex align-items-center align-middle">
|
||
<i class="flex-shrink-0 bx bx-credit-card me-2"></i>
|
||
<span class="flex-grow-1 align-middle">Billing</span>
|
||
<span class="flex-shrink-0 badge badge-center rounded-pill bg-danger w-px-20 h-px-20">!</span>
|
||
</span>
|
||
</a>
|
||
</li -->
|
||
<li>
|
||
<div class="dropdown-divider"></div>
|
||
</li>
|
||
<li>
|
||
<a class="dropdown-item" href="login.html">
|
||
<!-- a class="dropdown-item" href="#" onclick="logout(); return false;" -->
|
||
<i class="bx bx-power-off me-2"></i>
|
||
<span class="align-middle" id="label_logout">Log Out</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<!--/ User -->
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- / Navbar -->
|
||
|
||
<!-- Content wrapper -->
|
||
<div class="content-wrapper">
|
||
<!-- Content -->
|
||
<div class="container-xxl flex-grow-1 container-p-y">
|
||
<div class="row">
|
||
<div class="col-lg-12 col-md-12 order-1">
|
||
<div class="row">
|
||
<div class="col-lg-6 col-md-12 col-12 mb-4">
|
||
<div class="card">
|
||
<div class="card-header d-flex align-items-center justify-content-between">
|
||
<h6 class="card-title m-0 me-2" id="label_advices">advice questions</h6>
|
||
<!--div class="dropdown">
|
||
<button class="btn p-0" type="button" id="transactionID" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||
<i class="bx bx-dots-vertical-rounded"></i>
|
||
</button>
|
||
<div class="dropdown-menu dropdown-menu-end">
|
||
<a class="dropdown-item" href="javascript:void(0);">Last 28 Days</a>
|
||
<a class="dropdown-item" href="javascript:void(0);">Last Month</a>
|
||
<a class="dropdown-item" href="javascript:void(0);">Last Year</a>
|
||
</div>
|
||
</div -->
|
||
</div>
|
||
<div class="card-body" id="div_sel_question">
|
||
<select class="form-select" id="sel_rcm_question" size="5" aria-label="selected advice" onchange="clickedQuestion(this);"></select>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-6 col-md-12 col-12 mb-4">
|
||
<div class="card">
|
||
<div class="card-header d-flex align-items-center justify-content-between">
|
||
<h6 class="card-title m-0 me-2" id="label_history_questions">History</h6>
|
||
<!-- div class="dropdown">
|
||
<button class="btn p-0" type="button" id="transactionID" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||
<i class="bx bx-dots-vertical-rounded"></i>
|
||
</button>
|
||
<div class="dropdown-menu dropdown-menu-end">
|
||
<a class="dropdown-item" href="javascript:void(0);">Last 28 Days</a>
|
||
<a class="dropdown-item" href="javascript:void(0);">Last Month</a>
|
||
<a class="dropdown-item" href="javascript:void(0);">Last Year</a>
|
||
</div>
|
||
</div -->
|
||
</div>
|
||
<div class="card-body" id="div_sel_my_prompt">
|
||
<select class="form-select" id="sel_my_prompts" size="5" aria-label="selected my question" onchange="clickedQuestion(this);"></select>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="row">
|
||
<div class="col-md-12 col-lg-12 order-2 mb-4">
|
||
<div class="card">
|
||
<div class="card-header d-flex align-items-center justify-content-between" style="padding-right: 0pt;">
|
||
<div class="row" style="width: 100%;">
|
||
<div class="col-md-8 col-lg-10 order-2 mb-4">
|
||
<p id="msg_hint" class="text-muted" style="margin-top: 10px;"></p>
|
||
<div class="form-floating">
|
||
<textarea class="form-control" id="input_question" placeholder="question" rows="1" oninput="autoGrow(this)"></textarea>
|
||
<script>
|
||
function autoGrow(element) {
|
||
element.style.height = "auto";
|
||
element.style.height = (element.scrollHeight) + "px";
|
||
if(element.value.length <= 0){
|
||
document.getElementById("btn_ask").setAttribute("disabled", "disabled");
|
||
}else if(element.value.length > 1000){
|
||
document.getElementById("btn_ask").setAttribute("disabled", "disabled");
|
||
|
||
document.getElementById("msg_question").innerHTML = document.getElementById("msg_question").innerHTML.substring(0, 1000);
|
||
}else{
|
||
document.getElementById("btn_ask").removeAttribute("disabled");
|
||
}
|
||
}
|
||
</script>
|
||
<label for="input_question" id="label_question">Input question</label>
|
||
<p id="msg_question" class="text-muted" style="margin-top: 10px;"></p>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-4 col-lg-2 order-2 mb-4" style="text-align:right;">
|
||
<button style="white-space:nowrap;width:90%;height:80pt;padding:0;max-width:200pt;" class="btn btn-info" onclick="sendAsk();" id="btn_ask">ask</button>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="row">
|
||
<div class="col-md-12 col-lg-12 order-2 mb-4">
|
||
<div id="scroll_div">
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!--div class="mb-3" style="width: 30%; margin-left: 35%;" id="div_list_more">
|
||
<button class="btn btn-primary d-grid w-100" id="title_list_more" onclick="listUsers();"></button>
|
||
<div -->
|
||
|
||
</div>
|
||
|
||
<div id="spinner" class="spinner">
|
||
<div class="spinner-icon"></div>
|
||
</div>
|
||
|
||
<button id="toTopBtn">Top</button>
|
||
|
||
<!-- / Content -->
|
||
|
||
<!-- Footer -->
|
||
<footer class="content-footer footer bg-footer-theme">
|
||
<div class="container-xxl d-flex flex-wrap justify-content-between py-2 flex-md-row flex-column">
|
||
<div class="mb-2 mb-md-0">
|
||
©
|
||
<script>
|
||
document.write(new Date().getFullYear());
|
||
</script>
|
||
<a href="#" target="_blank" class="footer-link fw-bolder">amiPro(Powered by OpenAI-4o)</a>
|
||
</div>
|
||
<div id="msg_warning" style="width: 50%;text-align: center;">Warning</div>
|
||
<div>
|
||
<a
|
||
href="mailto:support@amipro.me?subject=contact"
|
||
target="_blank"
|
||
class="footer-link me-4"
|
||
id="title_contact" style="font-weight: bold;"
|
||
>Contact</a
|
||
>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
<!-- / Footer -->
|
||
|
||
<div class="content-backdrop fade"></div>
|
||
</div>
|
||
<!-- Content wrapper -->
|
||
</div>
|
||
<!-- / Layout page -->
|
||
</div>
|
||
|
||
<!-- Overlay -->
|
||
<div class="layout-overlay layout-menu-toggle"></div>
|
||
</div>
|
||
<!-- / Layout wrapper -->
|
||
|
||
<!-- Core JS -->
|
||
<script src="files/popper.js"></script>
|
||
<script src="files/bootstrap.js"></script>
|
||
<script src="files/perfect-scrollbar.js"></script>
|
||
<script src="files/menu.js"></script>
|
||
<script src="files/main.js"></script>
|
||
<!-- endbuild -->
|
||
|
||
<!-- Vendors JS -->
|
||
<!-- script src="files/apexcharts.js"></!-script -->
|
||
|
||
|
||
<!-- Page JS -->
|
||
<script src="files/dashboards-analytics.js"></script>
|
||
|
||
<!-- Place this tag in your head or just before your close body tag. -->
|
||
<script async defer src="https://buttons.github.io/buttons.js"></script>
|
||
</body>
|
||
</html>
|