7Local HTTP server on 127.0.0.1 — started as a daemon thread during `aquin chat`.
8Default port: AQUIN_ENGINE_PORT → ~/.aquin/engine-info.json → 17832 (not 8002).
9Handles routes from inspection-backend so the web app can call GPU tools
12from __future__
import annotations
16from http.server
import BaseHTTPRequestHandler, HTTPServer
21PORT = DEFAULT_ENGINE_PORT
22_server: HTTPServer |
None =
None
23_thread: threading.Thread |
None =
None
26_is_daemon: bool =
False
28_switch_accept_lock = threading.Lock()
30_session_label_cache: dict[tuple[int, str], str] = {}
36 resident, _ = resident_from_cache()
45 slug = load_weights(requested_model_id)
47 set_daemon_state(status=
"running", model_id=slug)
50 except Exception
as exc:
54 fail_load(str(requested_model_id), str(exc)
or exc.__class__.__name__)
57 print(f
"[daemon] model load failed: {exc}", flush=
True)
60def _read_body(handler: BaseHTTPRequestHandler) -> dict:
61 length = int(handler.headers.get(
"Content-Length", 0))
62 raw = handler.rfile.read(length)
if length
else b
"{}"
64 return json.loads(raw)
69def _respond(handler: BaseHTTPRequestHandler, data: Any, status: int = 200) ->
None:
73 body = dumps_json_safe(data).encode()
74 handler.send_response(status)
75 handler.send_header(
"Content-Type",
"application/json")
76 handler.send_header(
"Content-Length", str(len(body)))
77 handler.send_header(
"Access-Control-Allow-Origin",
"*")
79 handler.wfile.write(body)
82def _respond_error(handler: BaseHTTPRequestHandler, msg: str, status: int = 500) ->
None:
83 _respond(handler, {
"error": msg}, status)
87 def log_message(self, *args):
91 self.send_response(204)
92 self.send_header(
"Access-Control-Allow-Origin",
"*")
93 self.send_header(
"Access-Control-Allow-Methods",
"POST, GET, OPTIONS")
94 self.send_header(
"Access-Control-Allow-Headers",
"Content-Type, Authorization, x-tab-id")
98 path = self.
path.split(
"?")[0]
102 params = dict(urllib.parse.parse_qsl(self.
path.split(
"?", 1)[1]))
104 if path ==
"/health":
106 elif path ==
"/model/status":
108 elif path ==
"/sae-layers":
110 elif path ==
"/model/load":
116 path = self.
path.split(
"?")[0]
144 handler_fn = handlers.get(path)
155 _respond(self, health_payload(daemon=_is_daemon, port=PORT))
160 payload = health_payload(daemon=_is_daemon, port=PORT)
165 "model_id": payload.get(
"model_id"),
166 "daemon": _is_daemon,
167 "model_status": payload.get(
"model_status"),
168 "loading_model_id": payload.get(
"loading_model_id"),
169 "last_error": payload.get(
"last_error"),
170 "model_kind": snap.kind,
171 "elapsed_s": payload.get(
"elapsed_s"),
172 "vram": payload.get(
"vram"),
180 name = body.get(
"name")
181 args = body.get(
"args")
or {}
182 ctx = body.get(
"ctx")
or {}
194 result = dispatch(name, args, ctx)
195 _respond(self, {
"ok":
True,
"result": result})
196 except NotImplementedError
as e:
197 _respond(self, {
"ok":
False,
"error": str(e)
or "not implemented"})
198 except Exception
as e:
199 _respond(self, {
"ok":
False,
"error": str(e)})
203 model_id = body.get(
"model_id")
216 resolved, kind = resolve_kind(model_id)
217 with _switch_accept_lock:
219 if current.phase == ModelPhase.LOADING:
220 if current.target_id == resolved:
227 "model_id": resolved,
236 f
"background engine is already loading {current.target_id}. "
237 "Cancel that load first (Remove / Cancel in the Model picker)."
244 if loaded == resolved:
245 finish_load(resolved, kind)
252 "model_id": resolved,
261 target=_load_model_in_background,
267 {
"ok":
True,
"accepted":
True,
"status":
"loading",
"model_id": resolved},
269 except Exception
as e:
270 _respond(self, {
"ok":
False,
"error": str(e)})
274 model_id = body.get(
"model_id")
275 layer = body.get(
"layer")
276 if not model_id
or layer
is None:
281 resolve_model_id, get_loaded_model, load_model, load_sae, evict_sae_cache,
283 mid = resolve_model_id(model_id)
284 evict_sae_cache(mid, int(layer))
285 model = get_loaded_model()
or load_model(mid)
286 load_sae(model, int(layer), mid)
287 _respond(self, {
"ok":
True,
"model_id": mid,
"layer": int(layer)})
288 except Exception
as e:
289 _respond(self, {
"ok":
False,
"error": str(e)})
292 """Quick try-out completion against the resident model."""
294 prompt = (body.get(
"prompt")
or "").strip()
304 _respond(self, {
"ok":
False,
"error":
"no model loaded — run: aquin load model <id>"})
306 max_new = int(body.get(
"max_new_tokens")
or body.get(
"max_tokens")
or 200)
307 temperature = float(body.get(
"temperature", 0.7))
311 max_new_tokens=max_new,
312 temperature=temperature,
318 "model_id": model_id,
320 "response": response,
323 except Exception
as e:
324 _respond(self, {
"ok":
False,
"error": str(e)})
333 set_daemon_state(status=
"running", model_id=
None)
337 except Exception
as e:
338 _respond(self, {
"ok":
False,
"error": str(e)})
342 threading.Thread(target=stop, daemon=
True).
start()
345 model_id = params.get(
"model_id",
"llama-3.2-1b")
348 model_id = resolve_model_id(model_id)
349 cfg = get_config(model_id)
350 layer = cfg.get(
"sae_layer", 8)
351 _respond(self, {
"model_id": model_id,
"layers": [layer],
"default": layer})
352 except Exception
as e:
356 model_id = params.get(
"model_id",
"llama-3.2-1b")
357 self.send_response(200)
358 self.send_header(
"Content-Type",
"text/event-stream")
359 self.send_header(
"Cache-Control",
"no-cache")
360 self.send_header(
"Access-Control-Allow-Origin",
"*")
363 def _sse(data: dict) ->
None:
364 line = f
"data: {json.dumps(data)}\n\n"
365 self.wfile.write(line.encode())
372 model_id = resolve_model_id(model_id)
374 if snap.phase == ModelPhase.LOADING
and snap.target_id != model_id:
379 f
"already loading {snap.target_id}; cancel first"
384 _sse({
"stage":
"model",
"message": f
"Loading {model_id}..."})
385 slug = load_weights(model_id)
386 _sse({
"stage":
"done",
"model_id": slug})
387 except Exception
as e:
388 _sse({
"stage":
"error",
"message": str(e)})
394 feature_idx = body.get(
"feature_idx")
395 model_id = body.get(
"model_id",
"llama-3.2-1b")
396 layer = body.get(
"layer")
397 top_k = int(body.get(
"top_k", 10))
399 if feature_idx
is None:
407 model_id = resolve_model_id(model_id)
408 model = get_loaded_model()
410 model = load_model(model_id)
415 result = get_feature_logits(int(feature_idx), model, model_id=model_id, layer=layer, top_k=top_k)
416 enrich_feature_tool_result(
418 prompt=prompt_for_labeling(),
420 client=get_openai_client(),
425 except Exception
as e:
430 feature_idx = body.get(
"feature_idx")
431 model_id = body.get(
"model_id",
"llama-3.2-1b")
432 layer = body.get(
"layer")
433 top_k = int(body.get(
"top_k", 8))
435 if feature_idx
is None:
442 enrich_feature_tool_result,
443 get_feature_neighbors,
448 model_id = resolve_model_id(model_id)
449 model = get_loaded_model()
451 model = load_model(model_id)
452 result = get_feature_neighbors(int(feature_idx), model_id=model_id, layer=layer, top_k=top_k)
453 enrich_feature_tool_result(
455 prompt=prompt_for_labeling(),
457 client=get_openai_client(),
460 label_neighbors=
True,
463 except Exception
as e:
468 model_id = body.get(
"model_id",
"llama-3.2-1b")
469 layer = body.get(
"layer")
474 result = _ensure_umap_loaded({
"model_id": model_id,
"layer": layer}, {})
475 if result.get(
"error"):
478 _respond(self, {
"points": result.get(
"points", []),
"cached":
False})
479 except Exception
as e:
484 prompt = body.get(
"prompt",
"")
485 response = body.get(
"response",
"")
486 model_id = body.get(
"model_id",
"llama-3.2-1b")
487 layer = body.get(
"layer")
494 model_id = resolve_model_id(model_id)
495 model = get_loaded_model()
497 model = load_model(model_id)
499 feat = run_feature_analysis_unlabeled(prompt, response, model, model_id=model_id, layer=layer)
500 label_inspection_features(
504 client=get_openai_client(),
509 self.send_response(200)
510 self.send_header(
"Content-Type",
"text/event-stream")
511 self.send_header(
"Cache-Control",
"no-cache")
512 self.send_header(
"Access-Control-Allow-Origin",
"*")
515 def _sse(data: dict) ->
None:
516 line = f
"data: {json.dumps(data)}\n\n"
517 self.wfile.write(line.encode())
520 _sse({
"type":
"tokens", **feat})
522 seen: set[int] = set()
523 for f
in feat.get(
"top_response_features", []):
524 fi = f[
"feature_idx"]
527 _sse({
"type":
"label",
"feature_idx": fi,
"label": f.get(
"label", f
"feature_{fi}")})
528 for attr
in feat.get(
"attribution", []):
529 for f
in attr.get(
"driven_by_features", []):
530 fi = f[
"feature_idx"]
533 _sse({
"type":
"label",
"feature_idx": fi,
"label": f.get(
"label", f
"feature_{fi}")})
535 _sse({
"type":
"done"})
537 except Exception
as e:
538 self.send_response(500)
539 self.send_header(
"Content-Type",
"application/json")
541 self.wfile.write(json.dumps({
"error": str(e)}).encode())
545 prompt = body.get(
"prompt",
"")
546 response = body.get(
"response",
"")
547 model_id = body.get(
"model_id",
"llama-3.2-1b")
548 layer = body.get(
"layer")
554 model_id = resolve_model_id(model_id)
555 model = get_loaded_model()
557 model = load_model(model_id)
559 result = run_feature_analysis_unlabeled(prompt, response, model, model_id=model_id, layer=layer)
561 except Exception
as e:
566 prompt = body.get(
"prompt",
"")
567 top_k = int(body.get(
"top_k", 5))
568 model_id = body.get(
"model_id",
"llama-3.2-1b")
574 model_id = resolve_model_id(model_id)
575 results = run_logit_lens(prompt, model_id=model_id, top_k=top_k)
576 _respond(self, {
"results": results})
577 except Exception
as e:
582 prompt = body.get(
"prompt",
"")
583 target = body.get(
"target",
"")
584 model_id = body.get(
"model_id",
"llama-3.2-1b")
590 model_id = resolve_model_id(model_id)
591 results = run_trace(prompt, target, model_id=model_id)
592 _respond(self, {
"results": results})
593 except Exception
as e:
598 prompt = body.get(
"prompt",
"")
599 response = body.get(
"response",
"")
600 model_id = body.get(
"model_id",
"llama-3.2-1b")
602 prompt_tokens = prompt.split(
" ")
603 response_tokens = response.split(
" ")
604 sig_prompt_tis = list(range(len(prompt_tokens)))
605 sig_response_tis = list(range(len(response_tokens)))
606 noise_scale = float(body.get(
"noise_scale", 3.0))
607 n_noise_runs = int(body.get(
"n_noise_runs", 5))
609 if "prompt_tokens" in body:
610 prompt_tokens = body[
"prompt_tokens"]
611 response_tokens = body[
"response_tokens"]
612 sig_prompt_tis = body.get(
"sig_prompt_tis", sig_prompt_tis)
613 sig_response_tis = body.get(
"sig_response_tis", sig_response_tis)
619 model_id = resolve_model_id(model_id)
620 result = run_prompt_attribution(
622 prompt_tokens, response_tokens,
623 sig_prompt_tis, sig_response_tis,
625 noise_scale, n_noise_runs,
628 except Exception
as e:
633 feature_idx = body.get(
"feature_idx")
634 prompt = body.get(
"prompt",
"")
635 n_samples = int(body.get(
"n_samples", 10))
636 layer = body.get(
"layer")
637 model_id = body.get(
"model_id",
"llama-3.2-1b")
639 if feature_idx
is None:
644 _respond_error(self,
"interp-score requires OpenAI API key (server-side only)", 503)
648 prompt = body.get(
"prompt",
"")
649 feature_idx = body.get(
"feature_idx")
650 strength = float(body.get(
"strength", 20.0))
651 model_id = body.get(
"model_id",
"llama-3.2-1b")
652 max_new_tokens = int(body.get(
"max_new_tokens", 200))
653 temperature = float(body.get(
"temperature", 0.7))
655 if feature_idx
is None:
663 model_id = resolve_model_id(model_id)
664 model = get_loaded_model()
666 model = load_model(model_id)
668 self.send_response(200)
669 self.send_header(
"Content-Type",
"text/event-stream")
670 self.send_header(
"Cache-Control",
"no-cache")
671 self.send_header(
"Access-Control-Allow-Origin",
"*")
674 for event
in run_steer_stream(
676 feature_idx=int(feature_idx),
679 max_new_tokens=max_new_tokens,
680 temperature=temperature,
682 line = f
"data: {json.dumps(event)}\n\n"
683 self.wfile.write(line.encode())
686 except Exception
as e:
688 self.wfile.write(f
"data: {json.dumps({'error': str(e)})}\n\n".encode())
695 _respond_error(self,
"steer-multi not yet implemented in local engine", 501)
699 query = body.get(
"query",
"")
700 templates = body.get(
"templates")
701 model_id = body.get(
"model_id",
"llama-3.2-1b")
711 model_id = resolve_model_id(model_id)
712 model = get_loaded_model()
714 model = load_model(model_id)
716 result = consistency_eval(query, model, templates=templates
or None)
718 except Exception
as e:
723 topics = body.get(
"topics")
724 model_id = body.get(
"model_id",
"llama-3.2-1b")
730 model_id = resolve_model_id(model_id)
731 model = get_loaded_model()
733 model = load_model(model_id)
735 result = suppression_eval(model, topics=topics
or None)
737 except Exception
as e:
742 prompts = body.get(
"prompts", [])
743 model_id = body.get(
"model_id",
"llama-3.2-1b")
748 if len(prompts) > 20:
756 model_id = resolve_model_id(model_id)
757 model = get_loaded_model()
759 model = load_model(model_id)
761 result = boundary_eval(prompts, model)
763 except Exception
as e:
768 messages = body.get(
"messages", [])
769 model_id = body.get(
"model_id",
"llama-3.2-1b")
770 max_new_tokens = int(body.get(
"max_new_tokens", 200))
771 temperature = float(body.get(
"temperature", 0.7))
774 for m
in reversed(messages):
775 if m.get(
"role") ==
"user":
776 user_content = m.get(
"content",
"")
783 model_id = resolve_model_id(model_id)
784 response = run_chat(user_content, model_id=model_id, max_new_tokens=max_new_tokens, temperature=temperature)
785 _respond(self, {
"response": response})
786 except Exception
as e:
791 global _server, _thread, PORT
792 if _server
is not None:
795 PORT = resolve_engine_port()
797 _server = HTTPServer((
"127.0.0.1", PORT), _Handler)
802 _thread = threading.Thread(target=_server.serve_forever, daemon=
True)
804 print(
"[syncing with web]", flush=
True)
815 """Run the server in the foreground (used by the standalone model daemon)."""
816 global _server, _is_daemon
819 _server = HTTPServer((
"127.0.0.1", port), _Handler)
820 except OSError
as exc:
821 print(f
"[daemon] cannot bind 127.0.0.1:{port}: {exc}", flush=
True)
823 print(f
"[daemon] listening on 127.0.0.1:{port}", flush=
True)
825 _server.serve_forever()
826 except KeyboardInterrupt:
_handle_model_status(self)
_handle_model_load(self, dict params)
_handle_evals_suppression(self)
_handle_interp_score(self)
_handle_evals_boundary(self)
_handle_attribution(self)
_handle_model_switch(self)
_handle_steer_multi(self)
_handle_sae_layers(self, dict params)
_handle_feature_neighbors(self)
_handle_chat_inspect(self)
_handle_label_features_stream(self)
_handle_feature_logits(self)
_handle_evals_consistency(self)
None _respond(BaseHTTPRequestHandler handler, Any data, int status=200)
None run_forever(int port=PORT)
str|None _current_loaded_model_id()
None _respond_error(BaseHTTPRequestHandler handler, str msg, int status=500)
dict _read_body(BaseHTTPRequestHandler handler)
None _load_model_in_background(str requested_model_id)