Spaces:
Running
Running
File size: 10,296 Bytes
91111e4 4b05d12 91111e4 4b05d12 91111e4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | <!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hikari Chatbot</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="chat-container">
<header class="chat-header">
<h1>Hikari</h1>
<div class="header-controls">
<span id="interaction-mode-badge" class="interaction-mode-badge" title="Click để đổi chế độ tương tác">📝→📝</span>
<label class="thinking-toggle" title="Enable/Disable LLM Thinking">
<input type="checkbox" id="thinking-toggle" onchange="if(typeof setLLMThinkingEnabled==='function')setLLMThinkingEnabled(this.checked)">
<span class="thinking-toggle-label">🧠</span>
</label>
<button id="help-button" title="Hướng dẫn sử dụng">❓</button>
<button id="rules-button" title="Xem danh sách rules">📋</button>
<button id="macros-button" title="Xem danh sách Object Macros">🔧</button>
<button id="settings-button" title="Cài đặt">⚙️</button>
<select id="language-selector">
<option value="vi" selected>Tiếng Việt</option>
<option value="en">English</option>
<option value="ja">日本語</option>
</select>
</div>
</header>
<div id="rules-panel" class="slide-panel hidden">
<div class="slide-panel-header">
<h3 id="rules-title">📋 Các câu hỏi Hikari có thể trả lời</h3>
<button class="slide-panel-close" onclick="toggleRulesPanel()" aria-label="Đóng">×</button>
</div>
<div class="slide-panel-body">
<ul id="rules-list" class="rules-list"></ul>
</div>
</div>
<div id="macros-panel" class="slide-panel hidden">
<div class="slide-panel-header">
<h3 id="macros-title">🔧 Object Macros (Subroutines)</h3>
<button class="slide-panel-close" onclick="toggleMacrosPanel()" aria-label="Đóng">×</button>
</div>
<div class="slide-panel-body">
<ul id="macros-list" class="macros-list"></ul>
</div>
</div>
<div id="settings-panel" class="slide-panel hidden">
<div class="slide-panel-header">
<h3>⚙️ Settings</h3>
<button class="slide-panel-close" onclick="toggleSettingsPanel()" aria-label="Đóng">×</button>
</div>
<div class="slide-panel-body settings-body">
<div class="setting-item">
<label>
<input type="checkbox" id="history-toggle">
Chat History (gửi lịch sử cho LLM)
</label>
</div>
<div class="setting-item">
<label>
Max turns:
<input type="number" id="history-max-turns" value="5" min="0" max="50" class="setting-number">
</label>
<span class="setting-hint">0 = không giới hạn</span>
</div>
<div class="setting-item setting-buttons">
<button id="view-history-button" class="setting-btn">📜 View History</button>
<button id="clear-history-button" class="setting-btn setting-btn-danger">🗑 Clear History</button>
</div>
<div class="setting-item">
<label class="setting-label">Giới hạn lưu trữ:</label>
<select id="retention-mode-select" class="setting-select">
<option value="count">Giới hạn số lượng</option>
<option value="days">Giới hạn thời gian</option>
</select>
</div>
<div id="retention-count-section" class="setting-item">
<label>
Tối đa:
<input type="number" id="retention-max-count" value="50" min="1" max="10000" class="setting-number">
</label>
<span class="setting-hint">hội thoại</span>
</div>
<div id="retention-days-section" class="setting-item hidden">
<label>
Tối đa:
<input type="number" id="retention-max-days" value="30" min="1" max="3650" class="setting-number">
</label>
<span class="setting-hint">ngày</span>
</div>
<hr class="setting-divider">
<div class="setting-item">
<label class="setting-label">Chế độ tương tác:</label>
<select id="interaction-mode-select" class="setting-select">
<option value="text-text">📝→📝 Text → Text</option>
<option value="text-voice">📝→🔊 Text → Voice</option>
<option value="voice-text">🎤→📝 Voice → Text</option>
<option value="voice-voice">🎤→🔊 Voice → Voice</option>
</select>
</div>
<div id="tts-settings-section">
<div class="setting-item">
<label>
<input type="checkbox" id="voice-input-toggle">
Voice Input (Speech to Text)
</label>
</div>
<div class="setting-item">
<label>
<input type="checkbox" id="voice-output-toggle">
Voice Output (Text to Speech)
</label>
</div>
<div class="setting-item">
<label class="setting-label">Giọng đọc:</label>
<select id="tts-voice-select" class="setting-select"></select>
</div>
</div>
</div>
</div>
<div id="message-display" class="message-display"></div>
<div id="tts-status" class="tts-status hidden" aria-live="polite">
<span class="tts-spinner">⏳</span>
<span id="tts-status-text">Đang xử lý âm thanh...</span>
</div>
<div class="input-area">
<button id="attach-button" title="Đính kèm ảnh" aria-label="Đính kèm ảnh">📎</button>
<input type="file" id="file-input" accept="image/*" class="hidden">
<button id="voice-input-button" class="hidden" title="Nhập bằng giọng nói" aria-label="Nhập bằng giọng nói">🎤</button>
<div id="adapter-prefix-badge" class="adapter-prefix-badge hidden" aria-live="polite"></div>
<input type="text" id="message-input" placeholder="Nhập tin nhắn...">
<button id="send-button">Gửi</button>
</div>
<div id="attachment-preview" class="attachment-preview hidden">
<img id="attachment-thumb" alt="Preview" class="attachment-thumb">
<span id="attachment-name" class="attachment-name"></span>
<button id="attachment-remove" class="attachment-remove" aria-label="Xóa">×</button>
</div>
</div>
<!-- Help Dialog -->
<div id="help-overlay" class="help-overlay hidden" role="dialog" aria-modal="true" aria-labelledby="help-dialog-title">
<div class="help-dialog">
<div class="help-dialog-header">
<h2 id="help-dialog-title">📖 Hướng dẫn sử dụng</h2>
<button id="help-close-button" class="help-close-button" aria-label="Đóng">×</button>
</div>
<div id="help-dialog-body" class="help-dialog-body">
<!-- Nội dung được render bởi JS theo ngôn ngữ -->
</div>
</div>
</div>
<!-- History Dialog -->
<div id="history-overlay" class="help-overlay hidden" role="dialog" aria-modal="true">
<div class="help-dialog history-dialog">
<div class="help-dialog-header">
<h2 id="history-dialog-title">📜 Chat History</h2>
<div class="history-tab-buttons">
<button id="history-tab-db" class="history-tab active">IndexedDB</button>
<button id="history-tab-session" class="history-tab">Session</button>
</div>
<button id="history-close-button" class="help-close-button" aria-label="Đóng">×</button>
</div>
<div id="history-dialog-body" class="help-dialog-body">
<div id="history-list" class="history-list"></div>
<div id="history-paging" class="history-paging"></div>
</div>
</div>
</div>
<script src="https://unpkg.com/rivescript@latest/dist/rivescript.min.js"></script>
<script src="brain.js"></script>
<script src="data-loader.js"></script>
<script src="data/chat-history-db.js"></script>
<script src="adapters/language-selector.js"></script>
<script src="adapters/text-similarity.js"></script>
<script src="adapters/specific-response.js"></script>
<script src="adapters/time-adapter.js"></script>
<script src="adapters/math-adapter.js"></script>
<script src="adapters/unit-conversion.js"></script>
<script src="adapters/best-match.js"></script>
<script src="adapters/logic-dispatcher.js"></script>
<script src="adapters/web-search.js"></script>
<script src="adapters/llm-adapter.js"></script>
<script src="adapters/voice-adapter.js"></script>
<script src="adapters/adapter-registry.js"></script>
<script src="app.js"></script>
</body>
</html>
|