summaryrefslogtreecommitdiff
path: root/src/ollama_web/static/app.js
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-06-25 02:41:58 +0900
committertanaka takashi <isazaka@gmail.com>2026-06-25 02:41:58 +0900
commit5f948a33412dfde6d0a210746e61ac9c8477c9e8 (patch)
treedfbd1877e1a1c43df0777f0daff943620d0dac13 /src/ollama_web/static/app.js
parent697911563a1e8294aa415e8324bdd07901098876 (diff)
各モデルの機能を取得するように修正。thinking, tools, vision対応モデルに応じて機能を変えるように変更。クリアボタンのバグを修正
Diffstat (limited to 'src/ollama_web/static/app.js')
-rw-r--r--src/ollama_web/static/app.js64
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();