diff options
| author | tanaka takashi <isazaka@gmail.com> | 2026-06-25 02:41:58 +0900 |
|---|---|---|
| committer | tanaka takashi <isazaka@gmail.com> | 2026-06-25 02:41:58 +0900 |
| commit | 5f948a33412dfde6d0a210746e61ac9c8477c9e8 (patch) | |
| tree | dfbd1877e1a1c43df0777f0daff943620d0dac13 /src/ollama_web/static/app.js | |
| parent | 697911563a1e8294aa415e8324bdd07901098876 (diff) | |
各モデルの機能を取得するように修正。thinking, tools, vision対応モデルに応じて機能を変えるように変更。クリアボタンのバグを修正
Diffstat (limited to 'src/ollama_web/static/app.js')
| -rw-r--r-- | src/ollama_web/static/app.js | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/src/ollama_web/static/app.js b/src/ollama_web/static/app.js index 3240dcc..b9da89f 100644 --- a/src/ollama_web/static/app.js +++ b/src/ollama_web/static/app.js @@ -21,6 +21,34 @@ let currentSessionId = null; let currentSession = null; let pendingFiles = []; let abortController = null; +let currentCapabilities = new Set(); + +function updateThinkToggleState() { + if (!thinkToggle) return; + if (currentCapabilities.has("thinking")) { + thinkToggle.disabled = false; + thinkToggle.parentElement.classList.remove("disabled"); + } else { + thinkToggle.disabled = true; + thinkToggle.checked = false; + thinkToggle.parentElement.classList.add("disabled"); + } +} + +async function loadModelCapabilities() { + const model = modelSelect.value; + if (!model) return; + try { + const res = await fetch(`/api/models/${encodeURIComponent(model)}/capabilities`); + if (!res.ok) throw new Error(res.statusText); + const data = await res.json(); + currentCapabilities = new Set((data.capabilities || []).map((c) => c.toLowerCase())); + } catch (err) { + console.error("failed to load model capabilities", err); + currentCapabilities = new Set(); + } + updateThinkToggleState(); +} function getCookie(name) { const prefix = `${name}=`; @@ -440,6 +468,8 @@ sessionListEl.addEventListener("click", (e) => { } }); +modelSelect.addEventListener("change", loadModelCapabilities); + async function send() { const text = inputEl.value.trim(); if (!text && !pendingFiles.length) return; @@ -669,9 +699,36 @@ inputEl.addEventListener("keydown", (e) => { } }); -clearBtn.addEventListener("click", () => { - chatEl.innerHTML = ""; -}); +async function clearMessages() { + if (!currentSessionId) { + chatEl.innerHTML = ""; + pendingFiles = []; + renderAttachments(); + return; + } + + try { + const res = await csrfFetch(`/api/sessions/${currentSessionId}/messages`, { + method: "DELETE", + }); + if (!res.ok) throw new Error(res.statusText); + const data = await res.json(); + if (!data.cleared) throw new Error("クリアに失敗しました"); + + if (currentSession) { + currentSession.messages = []; + currentSession.files = []; + } + pendingFiles = []; + chatEl.innerHTML = ""; + renderAttachments(); + } catch (err) { + console.error("failed to clear messages", err); + alert("メッセージのクリアに失敗しました"); + } +} + +clearBtn.addEventListener("click", clearMessages); cancelBtn.addEventListener("click", () => { if (abortController) { @@ -680,3 +737,4 @@ cancelBtn.addEventListener("click", () => { }); loadSessions(); +loadModelCapabilities(); |
