// === RAG AI 助教 === function toggleRagChat() { var chat = document.getElementById('rag-chat'); if (!chat) return; chat.style.display = chat.style.display === 'none' ? 'flex' : 'none'; if (chat.style.display === 'flex') checkRagIndex(); } function checkRagIndex() { fetch('/api/rag/status/' + graphId).then(function(r){return r.json();}).then(function(data) { var btn = document.getElementById('rag-index-btn'); if (data.ready) { btn.textContent = '✅ 已索引 ' + data.indexed + '/' + data.total; btn.style.color = '#34d399'; } else { btn.textContent = '⚡ 建立索引'; btn.style.color = '#fbbf24'; } }).catch(function(){}); } function buildIndex() { var btn = document.getElementById('rag-index-btn'); btn.textContent = '索引中...'; btn.disabled = true; var token = localStorage.getItem('yaoskills_token'); fetch('/api/rag/embed/' + graphId, { method: 'POST', headers: { 'Authorization': 'Bearer ' + token } }).then(function(r){return r.json();}).then(function(data) { if (data.success) { showToast(data.message, 'success'); btn.textContent = '✅ 已索引 ' + data.count + '/' + data.count; btn.style.color = '#34d399'; } else { showToast(data.error || '索引失败', 'error'); btn.textContent = '⚡ 建立索引'; } btn.disabled = false; }).catch(function(e) { showToast('网络错误', 'error'); btn.disabled = false; btn.textContent = '⚡ 建立索引'; }); } function askRAG() { var input = document.getElementById('rag-input'); var q = input.value.trim(); if (!q) return; input.value = ''; var msgs = document.getElementById('rag-messages'); msgs.innerHTML += '
'; var loadId = 'rag-load-' + Date.now(); msgs.innerHTML += '
'; msgs.scrollTop = msgs.scrollHeight; var token = localStorage.getItem('yaoskills_token'); var headers = { 'Content-Type': 'application/json' }; if (token) headers['Authorization'] = 'Bearer ' + token; fetch('/api/rag/ask/' + graphId, { method: 'POST', headers: headers, body: JSON.stringify({ question: q }) }).then(function(r){return r.json();}).then(function(data) { var el = document.getElementById(loadId); if (!el) return; if (data.success) { var sourceHtml = ''; if (data.sources && data.sources.length > 0) { sourceHtml = '
'; } el.outerHTML = '
'; } else { el.outerHTML = '
'; } msgs.scrollTop = msgs.scrollHeight; }).catch(function(e) { var el = document.getElementById(loadId); if (el) el.outerHTML = '
'; }); } function ragEscapeHtml(text) { var div = document.createElement('div'); div.textContent = text; return div.innerHTML; }