An Attempt is a record of one probe execution against a target, with a unique id, status state (new, started, complete), and sequence number for matching prompts to results. The Message class models turns in multi-turn conversations with role, text, and optional multimodal attachments (image, audio, file), supporting the conversation protocol between probes and targets.
garak/attempt.py defines three Attempt status constants — ATTEMPT_NEW, ATTEMPT_STARTED, and ATTEMPT_COMPLETE — as range(3) (values 0, 1, 2).[1]
Each Attempt is assigned a uuid.uuid4() at construction time for unique identification.[1] Attempt carries a seq field (default -1) that garak.probes.base.Probe.probe sets as a sequence number starting at 0, enabling matching of individual prompts with lists of answers or targets and other post-hoc ordering.[1]
Valid Turn roles in garak/attempt.py are "system", "user", and "assistant", defined in the module-level roles set.[1] The Message dataclass supports multimodal content — text, images, audio, and files — but does not yet support multiple attachments of the same type.[1] A Turn is the atomic unit of a conversation in garak/attempt.py, pairing a role ("system", "user", or "assistant") with its associated content. A Message is composed of one or more Turn objects and represents the full structured conversation history exchanged between a probe and a target.
Multi-turn conversation support was added to probes and attempts in v0.13.0.[2] v0.15.0 extended attempt coverage further when the Agent Breaker probe added support for testing tools available to target systems.[3]
Sources