From 7b68413433314c156b5ba384d4f55f835a82573f Mon Sep 17 00:00:00 2001 From: michaelxer <52305679+michaelxer@users.noreply.github.com> Date: Mon, 8 Jun 2026 05:29:06 +0700 Subject: [PATCH] fix: expose supports_tools toggle for local endpoints in UI (#3195) * fix: expose supports_tools toggle for local endpoints in UI Local endpoints (Ollama, vLLM, etc.) default to fenced tool blocks when supports_tools is not set, which breaks tool calling for models that support native function calling. The backend already supports per-endpoint supports_tools overrides via the PATCH API, but there was no UI to set it. Add a 'Tools: Auto/On/Off' toggle button for local endpoints that cycles through the three states: - Auto (null): use the existing heuristic - On (true): always use native function calling - Off (false): always use fenced tool blocks Fixes #3141 * docs: add screenshot of supports_tools toggle showing Auto/On/Off states * Add Tools toggle screenshot for PR #3195 * refactor: convert Tools toggle to select dropdown per review feedback Replace cycle-through button with a ' : ''} ${hasModels ? '' : ''} @@ -476,6 +477,22 @@ async function loadEndpoints() { queryAll('[data-adm-toggle-ep]').forEach(btn => { btn.addEventListener('click', async (e) => { e.stopPropagation(); await fetch(`/api/model-endpoints/${btn.dataset.admToggleEp}`, { method: 'PATCH' }); loadEndpoints(); }); }); + queryAll('[data-adm-tools-select]').forEach(sel => { + sel.addEventListener('change', async (e) => { + e.stopPropagation(); + const epId = sel.dataset.admToolsSelect; + const val = sel.value; + const body = {}; + if (val === 'auto') body.supports_tools = null; + else body.supports_tools = val === 'true'; + await fetch(`/api/model-endpoints/${epId}`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + loadEndpoints(); + }); + }); queryAll('[data-adm-copy-url]').forEach(btn => { btn.addEventListener('click', (e) => { e.stopPropagation(); diff --git a/static/style.css b/static/style.css index 6703685a4..e711876bd 100644 --- a/static/style.css +++ b/static/style.css @@ -14154,6 +14154,22 @@ body:has(.doc-version-panel:not(.hidden)) .hamburger-btn { background: var(--border); border-color: var(--red); } +.admin-tools-select { + padding: 3px 6px; + border: 1px solid var(--border); + border-radius: 6px; + background: var(--panel); + color: var(--fg); + cursor: pointer; + font-size: 11px; + font-family: inherit; + height: 26px; + min-width: 90px; +} +.admin-tools-select:hover { + background: var(--border); + border-color: var(--red); +} .admin-spinner { display: inline-block; width: 12px; @@ -14269,6 +14285,7 @@ body:has(.doc-version-panel:not(.hidden)) .hamburger-btn { .admin-ep-actions { display: flex; gap: 4px; + align-items: center; flex-shrink: 0; }