From d345b32856e9621731359eb4ae6bc62dce2ceeee Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 21 May 2026 22:00:44 -0400 Subject: [PATCH] feat(llm): user-controlled think mode (default off); remove qwen3 hardcode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The chat generation pipeline previously forced think=True unconditionally to match qwen3's combined think+tools template, locking the system into that model family. Bench data (2026-05-21, qwen3:30b-a3b/qwen3:32b on CPU) showed thinking adds 1-2 minutes per turn for unclear quality benefit — qwen3:30b-a3b even produced more rambling with think on. This decouples think from the model family by reading a per-user `think_enabled` setting (default `false`). Non-qwen3 models can now run through the same pipeline without the silent-generation failure mode that content-gated thinking would have caused — they just don't think. qwen3 users who still want thinking can opt in via the Settings UI. Settings UI: - New "Enable model thinking" checkbox in General → Assistant section. - Help text explains the default-off rationale and when to opt in. - Persists via the existing settings API; no schema migration needed (Setting is key/value text). Telemetry to confirm whether this regresses tool-call reliability on qwen3 (the current model) is in a follow-up commit (generation_tool_log). Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/src/views/SettingsView.vue | 34 +++++++++++++++++++ .../services/generation_task.py | 13 ++++--- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue index fbf138f..21a2f8a 100644 --- a/frontend/src/views/SettingsView.vue +++ b/frontend/src/views/SettingsView.vue @@ -21,6 +21,8 @@ const savingTimezone = ref(false); const timezoneSaved = ref(false); const autoConsolidateTasks = ref(true); const savingAutoConsolidate = ref(false); +const thinkEnabled = ref(false); +const savingThinkEnabled = ref(false); async function saveAutoConsolidate() { savingAutoConsolidate.value = true; @@ -35,6 +37,19 @@ async function saveAutoConsolidate() { } } +async function saveThinkEnabled() { + savingThinkEnabled.value = true; + try { + await apiPut('/api/settings', { + think_enabled: thinkEnabled.value ? "true" : "false", + }); + } catch { + toastStore.show('Failed to save setting', 'error'); + } finally { + savingThinkEnabled.value = false; + } +} + function detectTimezone() { userTimezone.value = Intl.DateTimeFormat().resolvedOptions().timeZone; } @@ -771,6 +786,9 @@ onMounted(async () => { userTimezone.value = allSettings.user_timezone ?? ""; // Default true if unset; explicit "false" disables auto-consolidation. autoConsolidateTasks.value = (allSettings.auto_consolidate_tasks ?? "true") !== "false"; + // Default false: think mode is opt-in. Bench showed it costs 1-2 min/turn + // for unclear benefit; qwen3 users can re-enable if tool calls regress. + thinkEnabled.value = (allSettings.think_enabled ?? "false") === "true"; chatRetentionDays.value = allSettings.chat_retention_days !== undefined ? Number(allSettings.chat_retention_days) : 90; @@ -1518,6 +1536,22 @@ function formatUserDate(iso: string): string {

+
+ +

+ When on, the chat model runs in reasoning mode before responding. + Default off — bench data showed thinking adds 1–2 minutes per turn for unclear quality benefit. + Turn on for qwen3-family models if tool-call reliability drops without it. +

+