garak/probes/base.py defines Probe, the base class all probe plugins must inherit from; it inherits from Configurable and provides the template for LLM evaluation logic.[1]
Probe.active defaults to False, meaning probes are not included in default scan runs unless explicitly set to True in a subclass.[1] Probe.tier defaults to Tier.UNLISTED, the lowest priority tier; concrete probes should override this to OF_CONCERN, COMPETE_WITH_SOTA, or INFORMATIONAL. Probe tiers were introduced in v0.11.0 and are surfaced in --list_probes output (added in v0.14.1).[1][2] Probe.intent is None by default; concrete probes must set it to a code from the CAS trait typology (garak/data/cas/trait_typology.json). The value is propagated to every Attempt minted by the probe via _mint_attempt. If a loaded payload also declares an intent, the payload intent takes priority.[1] Probe.lang should be set in BCP47 format or None; a value of "*" means the probe applies to all languages.[1] Probe.modality defaults to {"in": {"text"}}, indicating probes target text-input models. The legal modality['in'] values are 'text', 'image', 'audio', 'video', and '3d'.[1] Probe.tags stores MISP-format taxonomy categories as an iterable of strings, defaulting to an empty list.[1] Probe.parallelisable_attempts defaults to True; probes that cannot be safely parallelised must set this to False.[1] Probe._run_params enumerates the parameters applied at run time: generations, soft_probe_prompt_cap, seed, and system_prompt.[1]
Probe.recommended_detector defaults to ["always.Fail"] as a sentinel value to signal if a probe subclass has not overridden its detector configuration.[1] Probe.recommended_detector is deprecated; if it is set (and primary_detector is not), Probe.__init__ emits a deprecation notice targeting version 0.9.0.6, then auto-migrates the first entry to primary_detector and the remainder to extended_detectors.[1]
Probe.description is auto-populated from the first line of the class docstring during __init__ if not already set; probes without a docstring get an empty string description.[1] During Probe.__init__, if the probe has a langprovider and a triggers attribute, triggers are automatically translated via the language provider: str triggers are batch-translated, list-of-list triggers are translated per sub-list, and any other trigger type raises PluginConfigurationError.[1]
Probe._mint_attempt accepts a prompt of type str, garak.attempt.Message, or garak.attempt.Conversation; if a Conversation is passed and it already contains a system turn, the probe's own system_prompt is not prepended again.[1] Probe._mint_attempt propagates the probe's intent to every new Attempt, using _payload_intent (if set) in preference to the probe-level intent, implementing the rule that payload intent overrides probe intent.[1] Probe._mint_attempt emits a warning (rather than raising an exception) when no prompt is provided, to preserve support for atkgen-style probes that create empty attempts.[1]
Probe._buff_hook skips buffing entirely when no buffs are loaded (_config.buffmanager.buffs is empty), and respects _config.plugins.buff_max to cap the number of buffed attempts added.[1] Probe._generator_cleanup calls self.generator.clear_history() to reset generator state between runs; probes that manage stateful generators should be aware this is called automatically.[1] A buff is a garak plugin that transforms or augments probe prompts before they are sent to the model — for example by paraphrasing or encoding them — allowing a single probe to exercise a wider range of attack variants without duplicating prompt logic.
Sources