AI 設定
-
-
-
-
Gemini API Key
-
聊天問答與文件萃取都用這一把。
免費申請,金鑰只存在你自己的知識庫裡。
-
-
-
-
-
讓知識卡整理得更好(選填)
-
-
- 讀你文件、整理成知識卡的那個 AI,換成更強的模型。卡片會更抓得到重點、關聯也連得更準,之後搜尋和問答的品質跟著提升。需要你的電腦已安裝 Claude Code。不填就用上面那把 Gemini,一樣能用。
-
-
-
-
+
+ 這裡不需要任何設定。聊天問答用的是你自己 Cloudflare 帳號內建的 AI,裝好就能直接問。
+ 文件整理成知識卡的部分,請在同步小幫手(電腦上的托盤圖示)的「AI 設定…」填一把 Gemini API Key。
@@ -824,72 +810,10 @@ function taipeiMonthDay(ms) { var d = new Date(ms + TAIPEI_OFFSET_MS); return {
}
})();
- // t131 AI 設定(合併 Gemini API Key+Claude 加強版)
- (function () {
- // 進入設定頁時讀取現有設定(GET /portal/admin/ai)
- function loadAiConfig() {
- if (!(S.profile && S.profile.role === 'admin')) return;
- fetch(API_BASE + '/portal/admin/ai', { headers: authHeaders() })
- .then(function (r) { return r.ok ? safeJson(r) : null; })
- .then(function (d) {
- if (!d) return;
- var ki = $('st-ai-key');
- if (ki && d.has_key) ki.placeholder = '已設定(留空=不變更)';
- var cb = $('st-ai-use-claude');
- if (cb) {
- // 有 claude 才能勾;沒有則停用並顯示提示
- var hint = $('st-ai-claude-hint');
- if (d.claude_available) {
- cb.disabled = false;
- cb.checked = !!d.use_claude_for_extract;
- if (hint) hint.style.display = 'none';
- } else {
- cb.disabled = true;
- cb.checked = false;
- if (hint) {
- hint.style.display = '';
- // 區分:從未連上小幫手 vs 有連上但沒裝 Claude
- hint.textContent = d.has_key
- ? '你的電腦沒有偵測到 Claude Code;裝好並讓小幫手重連一次後,這個選項就會開啟。'
- : '連上小幫手後才知道你的電腦有沒有 Claude Code。';
- }
- }
- }
- })
- .catch(function () { /* 讀不到不擋頁面 */ });
- }
- window._loadAiConfig = loadAiConfig;
-
- // 儲存
- var sb = $('st-ai-save');
- if (sb) sb.addEventListener('click', function () {
- var m = $('st-ai-status');
- var k = (($('st-ai-key') && $('st-ai-key').value) || '').trim();
- var cb = $('st-ai-use-claude');
- var useClaud = cb && !cb.disabled ? cb.checked : undefined;
- var body = {};
- if (k) body.gemini_api_key = k;
- if (useClaud !== undefined) body.use_claude_for_extract = useClaud;
- sb.disabled = true; m.textContent = '儲存中…'; m.style.color = '';
- fetch(API_BASE + '/portal/admin/ai', {
- method: 'POST',
- headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()),
- body: JSON.stringify(body)
- }).then(function (r) { return safeJson(r).then(function (d) { return { ok: r.ok, status: r.status, d: d }; }); })
- .then(function (x) {
- sb.disabled = false;
- if (guard401(x.status)) return;
- if (!x.ok) { m.textContent = (x.d && x.d.error) || '儲存失敗'; m.style.color = '#b03a26'; return; }
- if ($('st-ai-key')) { $('st-ai-key').value = ''; $('st-ai-key').placeholder = '已設定(留空=不變更)'; }
- var claudeOn = x.d && x.d.use_claude_for_extract;
- m.textContent = claudeOn
- ? '已儲存,萃取改用 Claude Code。小幫手請重連一次生效。'
- : '已儲存,AI 問答與萃取皆可使用。';
- m.style.color = '#3f7a4f';
- })
- .catch(function (e) { sb.disabled = false; m.textContent = friendlyErr(e); m.style.color = '#b03a26'; });
- });
- })();
+ // t176(leo 08-03):AI 設定的前端邏輯整段移除。
+ // 雲端聊天走 Workers AI(免金鑰);地端萃取金鑰改由同步小幫手托盤「AI 設定…」自己設。
+ // 原本這裡有 Claude 勾選框的 enable/disable 邏輯——它依賴 daemon 回報 has_claude,
+ // 而 daemon 從未實作該回報 ⇒ 勾選框恆為 disabled(leo 實測「hover 變可點但點擊沒反應」)。
$('st-logout').addEventListener('click', function () {
fetch(API_BASE + '/portal/logout', { method: 'POST', headers: authHeaders() }).catch(function () { /* 盡力而為 */ });