From 7fdb85713ad9c1878d0806150d1b612e8da8d9db Mon Sep 17 00:00:00 2001 From: Dorian Date: Thu, 2 Apr 2026 18:30:34 +0100 Subject: [PATCH] fix: AIUI proxy graceful error without API key, deploy proxy parity Claude proxy no longer crashes when ANTHROPIC_API_KEY is not set. Instead serves a 401 with a helpful message telling users to configure their API key in Settings. Fixes blank AIUI on fresh installs. Co-Authored-By: Claude Opus 4.6 (1M context) --- image-recipe/build-auto-installer-iso.sh | 5 ++++- scripts/deploy-to-target.sh | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/image-recipe/build-auto-installer-iso.sh b/image-recipe/build-auto-installer-iso.sh index ad9c9f6a..dfe001e3 100755 --- a/image-recipe/build-auto-installer-iso.sh +++ b/image-recipe/build-auto-installer-iso.sh @@ -2181,6 +2181,9 @@ class Handler(http.server.BaseHTTPRequestHandler): m = data.get("model", "") if m in MODEL_MAP: data["model"] = MODEL_MAP[m] body = json.dumps(data).encode() + if not API_KEY: + err = json.dumps({"type":"error","error":{"type":"auth_error","message":"AIUI not configured. Set your Anthropic API key in Settings > AIUI to enable AI chat."}}).encode() + self.send_response(401); self.send_header("Content-Type","application/json"); self.send_header("Content-Length",str(len(err))); self.end_headers(); self.wfile.write(err); return headers = {"Content-Type":"application/json","x-api-key":API_KEY,"anthropic-version":"2023-06-01","anthropic-dangerous-direct-browser-access":"true"} for h in ["anthropic-version","anthropic-beta"]: if self.headers.get(h): headers[h] = self.headers[h] @@ -2210,7 +2213,7 @@ class Handler(http.server.BaseHTTPRequestHandler): self.send_response(200); self.send_header("Content-Type","application/json"); self.end_headers(); self.wfile.write(b'{"status":"ok"}') else: self.send_response(404); self.end_headers() def log_message(self, fmt, *args): pass -if not API_KEY: print("ERROR: ANTHROPIC_API_KEY not set — configure via setup-aiui-server.sh"); sys.exit(1) +if not API_KEY: print("WARNING: ANTHROPIC_API_KEY not set — AIUI will return setup instructions") server = http.server.HTTPServer(("127.0.0.1", PORT), Handler) print(f"Claude API proxy on port {PORT}") server.serve_forever() diff --git a/scripts/deploy-to-target.sh b/scripts/deploy-to-target.sh index a75fdb8e..5e86d6f9 100755 --- a/scripts/deploy-to-target.sh +++ b/scripts/deploy-to-target.sh @@ -687,6 +687,9 @@ class Handler(http.server.BaseHTTPRequestHandler): m = data.get("model", "") if m in MODEL_MAP: data["model"] = MODEL_MAP[m] body = json.dumps(data).encode() + if not API_KEY: + err = json.dumps({"type":"error","error":{"type":"auth_error","message":"AIUI not configured. Set your Anthropic API key in Settings > AIUI to enable AI chat."}}).encode() + self.send_response(401); self.send_header("Content-Type","application/json"); self.send_header("Content-Length",str(len(err))); self.end_headers(); self.wfile.write(err); return headers = {"Content-Type":"application/json","x-api-key":API_KEY,"anthropic-version":"2023-06-01","anthropic-dangerous-direct-browser-access":"true"} for h in ["anthropic-version","anthropic-beta"]: if self.headers.get(h): headers[h] = self.headers[h] @@ -716,7 +719,7 @@ class Handler(http.server.BaseHTTPRequestHandler): self.send_response(200); self.send_header("Content-Type","application/json"); self.end_headers(); self.wfile.write(b"{\"status\":\"ok\"}") else: self.send_response(404); self.end_headers() def log_message(self, fmt, *args): pass -if not API_KEY: print("ERROR: ANTHROPIC_API_KEY not set"); sys.exit(1) +if not API_KEY: print("WARNING: ANTHROPIC_API_KEY not set — AIUI will return setup instructions") server = http.server.HTTPServer(("127.0.0.1", PORT), Handler) print(f"Claude API proxy on port {PORT}") server.serve_forever()