From 5f948a33412dfde6d0a210746e61ac9c8477c9e8 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Thu, 25 Jun 2026 02:41:58 +0900 Subject: 各モデルの機能を取得するように修正。thinking, tools, vision対応モデルに応じて機能を変えるように変更。クリアボタンのバグを修正 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ollama_web/static/app.js | 64 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 3 deletions(-) (limited to 'src/ollama_web/static/app.js') 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(); -- cgit v1.2.3