From 0514f5b67b17072275cba1cbb90780e0d57d8e4f Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 13 Jun 2026 20:08:55 +0000 Subject: [PATCH 1/2] Fix AttributeError: GpuCapabilities has no attribute 'vram_gb' main.py referenced info.vram_gb but the field is info.vram_total_gb. This crashed the FastAPI lifespan hook on every startup when AI_PROVIDER=local_gpu, causing a restart loop. https://claude.ai/code/session_01WVDg7amsy1TTtxvpku7bcM --- backend/app/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/main.py b/backend/app/main.py index 769607f..93c09fb 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -41,7 +41,7 @@ async def lifespan(app: FastAPI): info = get_cached_gpu_info() cc_str = f" | CC={info.compute_capability}" if info.compute_capability else "" print( - f"[gpu] {info.device_name} | {info.vram_gb:.1f} GB{cc_str} | " + f"[gpu] {info.device_name} | {info.vram_total_gb:.1f} GB{cc_str} | " f"tier={info.tier} | fp16={info.fp16}" ) for w in info.warnings: From 2a0c414a1c95392e9f95605280bbaa94e777c160 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 13 Jun 2026 22:43:15 +0000 Subject: [PATCH 2/2] Fix: wrap load_modules() in try/catch so a bad module constructor never kills GUI init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this, any constructor throw in any module stops load_modules() mid-loop and render_main_gui() (which builds the menu) never runs — resulting in a blank page with no menu. The failing module is now logged to the browser console instead of silently aborting startup. https://claude.ai/code/session_01WVDg7amsy1TTtxvpku7bcM --- frontend/src/js/core/base-gui.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/js/core/base-gui.js b/frontend/src/js/core/base-gui.js index aae7e05..ad11caf 100644 --- a/frontend/src/js/core/base-gui.js +++ b/frontend/src/js/core/base-gui.js @@ -82,8 +82,12 @@ class Base_gui_class { modules_context.keys().forEach(function (key) { if (key.indexOf('Base' + '/') < 0) { var moduleKey = key.replace('./', '').replace('.js', ''); - var classObj = modules_context(key); - _this.modules[moduleKey] = new classObj.default(); + try { + var classObj = modules_context(key); + _this.modules[moduleKey] = new classObj.default(); + } catch (e) { + console.error('[load_modules] Failed to load ' + key + ':', e); + } } }); }