86 if requested_model
is not None and _parse_flag(args,
"--checkpoint")
is None:
87 print(
"Error: capture-activations uses the loaded session model only.")
88 print(
" Pass --model <id> only when using --checkpoint <path>.")
97 position =
_parse_flag(args,
"--position")
or "last"
98 granularity =
_parse_flag(args,
"--granularity")
or "prompt"
101 encode_sae =
_has_flag(args,
"--encode-sae")
106 print(
"Error: --dir <path> is required (alias: --output <path>).", file=sys.stderr)
107 print(
" Example: aquin capture-activations --dir ./captures/my-run", file=sys.stderr)
110 if position
not in (
"last",
"mean"):
111 print(
"Error: --position must be last or mean")
113 if granularity
not in (
"prompt",
"token"):
114 print(
"Error: --granularity must be prompt or token")
123 resolve_capture_model_id,
124 resolve_probes_for_capture,
125 run_capture_activations,
132 mid = resolve_model_id(requested_model)
136 except ValueError
as e:
140 if checkpoint
and not Path(checkpoint).exists():
141 print(f
"Checkpoint not found: {checkpoint}")
144 out_dir = Path(out_dir_arg)
145 out_dir.mkdir(parents=
True, exist_ok=
True)
148 probes, probe_meta = resolve_probes_for_capture(
150 model_mode=model_mode,
151 prompts_path=prompts_path,
155 balance_group=balance_group,
156 output_dir=out_dir
if not prompts_path
else None,
158 except (FileNotFoundError, ValueError)
as e:
163 n_layers = llm_layer_count(mid, checkpoint)
164 layer_list = parse_layers(layers_spec, n_layers)
165 except ValueError
as e:
169 sae_layer = int(sae_layer_s)
if sae_layer_s
else None
170 ckpt_name = name
or (Path(checkpoint).stem
if checkpoint
else "base")
172 ctx = _build_tool_ctx(model_id=mid)
173 require_active_session(ctx, label=
"aquin capture-activations")
176 "model_mode": model_mode,
177 "prompts": probe_meta.get(
"prompts_path")
or probe_meta.get(
"generated_probes_path")
or "",
178 "probes_source": probe_meta.get(
"probes_source"),
179 "topic": probe_meta.get(
"topic")
or topic,
182 "layers": layers_spec
or "all",
183 "checkpoint": checkpoint
or "",
185 "position": position,
186 "granularity": granularity,
187 "encode_sae": encode_sae,
189 "group": balance_group
or "",
193 f
"[capture] mode={model_mode} model={mid} probes={len(probes)} "
194 f
"source={probe_meta.get('probes_source')} layers={layer_list} "
195 f
"position={position} granularity={granularity} balance={balance}"
196 f
"{f' group={balance_group}' if balance_group else ''} → {out_dir}"
199 payload = run_capture_activations(
203 model_mode=model_mode,
205 checkpoint_path=checkpoint,
206 checkpoint_name=ckpt_name
if checkpoint
else None,
208 granularity=granularity,
209 encode_sae=encode_sae,
211 capture_name=ckpt_name,
212 manifest_extras=probe_meta,
214 except Exception
as e:
218 print(f
"[capture] wrote {payload['manifest_path']}")
219 if payload.get(
"metadata_path"):
220 print(f
"[capture] wrote {payload['metadata_path']}")
221 for layer, rel
in payload.get(
"activation_files", {}).items():
223 f
"[capture] layer {layer}: {rel} "
224 f
"shape=({payload['n_probes']}, {payload.get('d_model', 'd_model')})"
226 if payload.get(
"sae_features"):
227 sf = payload[
"sae_features"]
228 print(f
"[capture] sae layer {sf['layer']}: n_features={sf['n_features']}")
231 sync_cli_result(ctx,
"run_capture_activations", sync_args, payload, card=card)
235 print(
"Batch activation capture for labeled probe sets (LLM).")
237 print(
"Prerequisite: aquin load --model <id>")