35 def _color(fidx: int) -> int:
36 if fidx
not in feature_color:
37 feature_color[fidx] = counter[0] % 10
39 return feature_color[fidx]
41 prompt_cm: dict[int, int] = {}
42 response_cm: dict[int, int] = {}
43 for entry
in attribution:
44 ri = entry[
"response_ti"]
45 for feat
in entry.get(
"driven_by_features", []):
46 cidx = _color(feat[
"feature_idx"])
47 response_cm[ri] = cidx
48 for pi
in feat.get(
"also_in_prompt_positions", []):
51 if not prompt_cm
and not response_cm:
53 return {
"prompt": prompt_cm,
"response": response_cm}
60 final_prob = logit_lens[-1][
"top_tokens"][0][
"prob"]
if logit_lens[-1].get(
"top_tokens")
else 0.0
61 for i, row
in enumerate(logit_lens):
62 prob = row[
"top_tokens"][0][
"prob"]
if row.get(
"top_tokens")
else 0.0
63 next_row = logit_lens[i + 1]
if i + 1 < len(logit_lens)
else None
64 next_prob = next_row[
"top_tokens"][0][
"prob"]
if next_row
and next_row.get(
"top_tokens")
else prob
65 delta = max(0.0, next_prob - prob)
67 "layer": row[
"layer"],
68 "drop": round(delta, 4),
69 "attn_drop": round(delta * 0.6, 4),
70 "mlp_drop": round(delta * 0.4, 4),
71 "baseline_prob": round(final_prob, 4),
76@register(
"run_full_inspection", {
79 "name":
"run_full_inspection",
81 "Run full inspection: generate a response, extract top SAE features at the given layer, "
82 "compute attribution, and run logit lens. layer must match a downloaded SAE "
83 "(aquin load sae <model>-l<n>). Omit layer to reuse lastSaeLayer from session memory. "
84 "Errors with available layers if the checkpoint is missing."
89 "prompt": {
"type":
"string",
"description":
"The prompt to inspect"},
93 "SAE layer index (aquin load sae <model>-l<n>). "
94 "Optional if lastSaeLayer is in session memory."
98 "required": [
"prompt"],
108 session_id: str = ctx.get(
"session_id")
or ""
109 state: dict[str, Any] = ctx.get(
"state", {})
111 prompt: str = args.get(
"prompt",
"")
or state.get(
"lastPrompt")
or "Hello"
112 model_id: str = get_active_model_id()
or state.get(
"activeModelId")
or "llama-3.2-1b"
113 layer_raw = args.get(
"layer")
114 layer: int |
None = int(layer_raw)
if layer_raw
is not None else None
117 model_id = resolve_model_id(model_id)
119 return {
"error": f
"Unknown model '{model_id}'. Run: aquin load --model <model-id>"}
125 memory=state.get(
"memory")
or {},
128 except ValueError
as e:
129 return {
"error": str(e)}
131 model = get_loaded_model()
134 model = load_model(model_id)
135 except Exception
as e:
136 return {
"error": f
"Could not load model: {e}"}
140 response = run_chat(prompt, model_id=model_id, max_new_tokens=200, temperature=0.7)
141 except Exception
as e:
142 return {
"error": f
"Generation failed: {e}"}
146 feat_result = run_feature_analysis_unlabeled(
147 prompt, response, model, model_id=model_id, layer=sae_layer,
149 except Exception
as e:
150 return {
"error": f
"Feature analysis failed: {e}"}
152 actual_layer = feat_result.get(
"sae_layer")
153 if actual_layer
is not None and int(actual_layer) != int(sae_layer):
156 f
"SAE layer mismatch: requested layer {sae_layer}, "
157 f
"feature analysis ran at layer {actual_layer}."
161 prompt_tokens: list[str] = feat_result.get(
"prompt_tokens", [])
162 response_tokens: list[str] = feat_result.get(
"response_tokens", [])
163 top_features: list[dict] = feat_result.get(
"top_response_features", [])
164 attribution: list[dict] = feat_result.get(
"attribution", [])
165 sae_layer: int = feat_result.get(
"sae_layer", sae_layer)
171 label_inspection_features(
175 client=get_openai_client(ctx),
179 top_features = feat_result.get(
"top_response_features", [])
180 attribution = feat_result.get(
"attribution", [])
181 except Exception
as e:
182 print(f
"[inspect] feature labeling failed: {e}", flush=
True)
186 logit_lens = run_logit_lens(prompt, model_id=model_id, top_k=5)
187 except Exception
as e:
188 print(f
"[inspect] logit-lens failed: {e}", flush=
True)
193 trace_target = response_tokens[0].strip()
if response_tokens
else ""
195 panel_card: dict[str, Any] = {
196 "type":
"inspectionFull",
199 "response": response,
201 "topFeatures": top_features,
202 "promptTokens": prompt_tokens,
203 "responseTokens": response_tokens,
204 "attribution": attribution,
205 "logitLensResults": logit_lens,
206 "traceResults": trace_results,
207 "traceTarget": trace_target,
208 "colorMap": color_map,
209 "saeLayer": sae_layer,
213 mem = load_local_memory(session_id
or "local")
215 "lastPrompt": prompt,
216 "lastResponse": response,
217 "lastTopFeatures": top_features[:5],
218 "lastSaeLayer": sae_layer,
220 save_local_memory(session_id
or "local", mem)
221 state.setdefault(
"memory", {})
222 state[
"memory"].update(mem)
227 "response": response,
228 "model_id": model_id,
229 "top_features": top_features,
230 "sae_layer": sae_layer,
236@register(
"get_feature_logits", {
239 "name":
"get_feature_logits",
241 "Get top tokens boosted and suppressed by a specific SAE feature. "
242 "Use the same layer as the last inspection (or pass layer explicitly)."
247 "feature_idx": {
"type":
"number",
"description":
"SAE feature index"},
250 "description":
"SAE layer (defaults to lastSaeLayer from session memory).",
252 "top_k": {
"type":
"number",
"description":
"Number of tokens to return (default 10)."},
254 "required": [
"feature_idx"],
268 state: dict[str, Any] = ctx.get(
"state", {})
if isinstance(ctx.get(
"state"), dict)
else {}
269 resident, _ = resident_from_cache()
271 state.get(
"activeModelId")
272 or args.get(
"model_id")
273 or get_loaded_llm_id()
278 "error":
"No model loaded. Ask the user to load one via the Model picker.",
280 feature_idx: int = int(args.get(
"feature_idx", 0))
281 layer_raw = args.get(
"layer")
283 top_k = int(args.get(
"top_k")
or 10)
284 except (TypeError, ValueError):
288 model_id = resolve_model_id(str(model_id))
290 return {
"error": f
"Unknown model '{model_id}'"}
296 memory=state.get(
"memory")
or {},
297 command=
"feature logit",
299 except ValueError
as e:
300 return {
"error": str(e)}
302 model = get_loaded_model()
305 model = load_model(model_id)
306 except Exception
as e:
307 return {
"error": str(e)}
312 result = _get_logits(feature_idx, model, model_id=model_id, layer=sae_layer, top_k=top_k)
313 enrich_feature_tool_result(
315 prompt=prompt_for_labeling(ctx, args),
317 client=get_openai_client(ctx),
321 return {
"content": result}
322 except Exception
as e:
324 return {
"error": friendly_message(e)}
327@register(
"get_feature_neighbors", {
330 "name":
"get_feature_neighbors",
332 "Find SAE features nearest to a given feature by cosine similarity. "
333 "Use the same layer as the last inspection (or pass layer explicitly)."
338 "feature_idx": {
"type":
"number",
"description":
"SAE feature index"},
341 "description":
"SAE layer (defaults to lastSaeLayer from session memory).",
343 "top_k": {
"type":
"number",
"description":
"Number of neighbors (default 8)."},
345 "required": [
"feature_idx"],
357 enrich_feature_tool_result,
358 get_feature_neighbors
as _get_neighbors,
364 state: dict[str, Any] = ctx.get(
"state", {})
if isinstance(ctx.get(
"state"), dict)
else {}
365 resident, _ = resident_from_cache()
367 state.get(
"activeModelId")
368 or args.get(
"model_id")
369 or get_loaded_llm_id()
374 "error":
"No model loaded. Ask the user to load one via the Model picker.",
376 feature_idx: int = int(args.get(
"feature_idx", 0))
377 layer_raw = args.get(
"layer")
379 top_k = int(args.get(
"top_k")
or 8)
380 except (TypeError, ValueError):
384 model_id = resolve_model_id(str(model_id))
386 return {
"error": f
"Unknown model '{model_id}'"}
392 memory=state.get(
"memory")
or {},
393 command=
"feature neighbor",
395 except ValueError
as e:
396 return {
"error": str(e)}
398 model = get_loaded_model()
401 model = load_model(model_id)
402 except Exception
as e:
403 return {
"error": str(e)}
406 result = _get_neighbors(feature_idx, model_id=model_id, layer=sae_layer, top_k=top_k)
407 enrich_feature_tool_result(
409 prompt=prompt_for_labeling(ctx, args),
411 client=get_openai_client(ctx),
414 label_neighbors=
True,
416 return {
"content": result}
417 except Exception
as e:
419 return {
"error": friendly_message(e)}