Skip to content

Commit 8be27c9

Browse files
rlundeen2Copilot
andauthored
MAINT: Initializers Cleanup (microsoft#2100)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 4593d99 commit 8be27c9

61 files changed

Lines changed: 852 additions & 1586 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/instructions/scenarios.instructions.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ per-objective build the `AtomicAttack` list themselves (see "Manual AtomicAttack
203203

204204
Techniques are described by `AttackTechniqueFactory` instances rather than a separate spec
205205
dataclass. The canonical catalog lives in
206-
`pyrit.setup.initializers.components.scenario_techniques` (`build_scenario_technique_factories()`)
207-
and is loaded into the registry by `ScenarioTechniqueInitializer`.
206+
`pyrit.setup.initializers.techniques` (`build_technique_factories()`)
207+
and is loaded into the registry by `TechniqueInitializer`.
208208

209209
```python
210210
from pyrit.scenario.core.attack_technique_factory import AttackTechniqueFactory
@@ -236,7 +236,7 @@ Key points:
236236

237237
```python
238238
registry = AttackTechniqueRegistry.get_registry_singleton()
239-
registry.register_from_factories(build_scenario_technique_factories())
239+
registry.register_from_factories(build_technique_factories())
240240
```
241241

242242
`register_from_factories` reads `factory.strategy_tags` to populate the per-entry tags used

.pyrit_conf_example

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,14 @@ memory_db_type: sqlite
1919
# ------------
2020
# List of built-in initializers to run during PyRIT initialization.
2121
# Initializers configure default values for converters, scorers, and targets.
22-
# Names are normalized to snake_case (e.g., "SimpleInitializer" -> "simple").
22+
# Names are normalized to snake_case (e.g., "TargetInitializer" -> "target").
2323
#
2424
# Available initializers:
25-
# - simple: Basic OpenAI configuration (requires OPENAI_CHAT_* env vars)
26-
# - airt: AI Red Team setup with Azure OpenAI (requires AZURE_OPENAI_* env vars)
2725
# - target: Registers available prompt targets into the TargetRegistry
2826
# - scorer: Registers pre-configured scorers into the ScorerRegistry
29-
# - load_default_datasets: Optional preload of default datasets for all registered
30-
# scenarios (scenarios otherwise fetch their datasets on demand)
31-
# - objective_list: Sets default objectives for scenarios
27+
# - technique: Registers attack techniques into the AttackTechniqueRegistry
28+
# - load_default_datasets: Loads datasets into memory so scenarios can run
29+
# - preload_scenario_metadata: Preloads scenario metadata into the registry
3230
#
3331
# Each initializer can be specified as:
3432
# - A simple string (name only)
@@ -39,21 +37,21 @@ memory_db_type: sqlite
3937
#
4038
# Example:
4139
# initializers:
42-
# - simple
40+
# - scorer
4341
# - name: target
4442
# args:
4543
# tags:
4644
# - default
4745
# - scorer
4846
initializers:
49-
- name: simple
50-
- name: scenario_technique
5147
- name: target
5248
args:
5349
tags:
5450
- default
5551
- scorer
5652
- name: scorer
53+
- name: technique
54+
- name: load_default_datasets
5755

5856
# Default Scenario
5957
# ----------------

doc/code/scenarios/0_attack_techniques.ipynb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"Techniques are registered into a singleton\n",
5252
"[`AttackTechniqueRegistry`](../../../pyrit/registry/components/attack_technique_registry.py)\n",
5353
"by an **initializer**. The canonical catalog lives in\n",
54-
"[`ScenarioTechniqueInitializer`](../../../pyrit/setup/initializers/components/scenario_techniques.py),\n",
54+
"[`TechniqueInitializer`](../../../pyrit/setup/initializers/techniques/technique_initializer.py),\n",
5555
"which registers a flat list of\n",
5656
"[`AttackTechniqueFactory`](../../../pyrit/scenario/core/attack_technique_factory.py) instances.\n",
5757
"Each factory is self-describing — it knows its `name`, the attack class it builds, its tags, and\n",
@@ -94,10 +94,10 @@
9494
"\n",
9595
"from pyrit.registry import AttackTechniqueRegistry\n",
9696
"from pyrit.setup import IN_MEMORY, initialize_pyrit_async\n",
97-
"from pyrit.setup.initializers.components import ScenarioTechniqueInitializer\n",
97+
"from pyrit.setup.initializers.techniques import TechniqueInitializer\n",
9898
"\n",
9999
"await initialize_pyrit_async(memory_db_type=IN_MEMORY, silent=True) # type: ignore\n",
100-
"await ScenarioTechniqueInitializer().initialize_async() # type: ignore\n",
100+
"await TechniqueInitializer().initialize_async() # type: ignore\n",
101101
"\n",
102102
"factories = AttackTechniqueRegistry.get_registry_singleton().get_factories()\n",
103103
"\n",
@@ -141,7 +141,7 @@
141141
"\n",
142142
"```mermaid\n",
143143
"flowchart LR\n",
144-
" I[\"ScenarioTechniqueInitializer\"] -->|registers factories| R[\"AttackTechniqueRegistry\"]\n",
144+
" I[\"TechniqueInitializer\"] -->|registers factories| R[\"AttackTechniqueRegistry\"]\n",
145145
" R -->|builds enum + tags| S[\"ScenarioStrategy\"]\n",
146146
" S -->|name / tag / composite| Sc[\"Scenario\"]\n",
147147
" R -->|create with target + scorer| T[\"AttackTechnique<br/>(attack + seeds)\"]\n",
@@ -184,7 +184,7 @@
184184
")\n",
185185
"```\n",
186186
"\n",
187-
"Wrap registration in a `PyRITInitializer` (as `ScenarioTechniqueInitializer` does) when you want it\n",
187+
"Wrap registration in a `PyRITInitializer` (as `TechniqueInitializer` does) when you want it\n",
188188
"to run as part of standard setup. Any scenario built afterwards will see `my_role_play` as a\n",
189189
"selectable strategy."
190190
]

doc/code/scenarios/0_attack_techniques.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
# Techniques are registered into a singleton
5151
# [`AttackTechniqueRegistry`](../../../pyrit/registry/components/attack_technique_registry.py)
5252
# by an **initializer**. The canonical catalog lives in
53-
# [`ScenarioTechniqueInitializer`](../../../pyrit/setup/initializers/components/scenario_techniques.py),
53+
# [`TechniqueInitializer`](../../../pyrit/setup/initializers/techniques/technique_initializer.py),
5454
# which registers a flat list of
5555
# [`AttackTechniqueFactory`](../../../pyrit/scenario/core/attack_technique_factory.py) instances.
5656
# Each factory is self-describing — it knows its `name`, the attack class it builds, its tags, and
@@ -67,10 +67,10 @@
6767

6868
from pyrit.registry import AttackTechniqueRegistry
6969
from pyrit.setup import IN_MEMORY, initialize_pyrit_async
70-
from pyrit.setup.initializers.components import ScenarioTechniqueInitializer
70+
from pyrit.setup.initializers.techniques import TechniqueInitializer
7171

7272
await initialize_pyrit_async(memory_db_type=IN_MEMORY, silent=True) # type: ignore
73-
await ScenarioTechniqueInitializer().initialize_async() # type: ignore
73+
await TechniqueInitializer().initialize_async() # type: ignore
7474

7575
factories = AttackTechniqueRegistry.get_registry_singleton().get_factories()
7676

@@ -109,7 +109,7 @@
109109
#
110110
# ```mermaid
111111
# flowchart LR
112-
# I["ScenarioTechniqueInitializer"] -->|registers factories| R["AttackTechniqueRegistry"]
112+
# I["TechniqueInitializer"] -->|registers factories| R["AttackTechniqueRegistry"]
113113
# R -->|builds enum + tags| S["ScenarioStrategy"]
114114
# S -->|name / tag / composite| Sc["Scenario"]
115115
# R -->|create with target + scorer| T["AttackTechnique<br/>(attack + seeds)"]
@@ -147,6 +147,6 @@
147147
# )
148148
# ```
149149
#
150-
# Wrap registration in a `PyRITInitializer` (as `ScenarioTechniqueInitializer` does) when you want it
150+
# Wrap registration in a `PyRITInitializer` (as `TechniqueInitializer` does) when you want it
151151
# to run as part of standard setup. Any scenario built afterwards will see `my_role_play` as a
152152
# selectable strategy.

doc/code/scenarios/0_scenarios.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,10 @@
127127
"from pyrit.scenario.core.matrix_atomic_attack_builder import build_matrix_atomic_attacks\n",
128128
"from pyrit.score.true_false.true_false_scorer import TrueFalseScorer\n",
129129
"from pyrit.setup import initialize_pyrit_async\n",
130-
"from pyrit.setup.initializers.components import ScenarioTechniqueInitializer\n",
130+
"from pyrit.setup.initializers.techniques import TechniqueInitializer\n",
131131
"\n",
132132
"await initialize_pyrit_async(memory_db_type=\"InMemory\") # type: ignore [top-level-await]\n",
133-
"await ScenarioTechniqueInitializer().initialize_async() # type: ignore [top-level-await]\n",
133+
"await TechniqueInitializer().initialize_async() # type: ignore [top-level-await]\n",
134134
"\n",
135135
"\n",
136136
"class MyStrategy(ScenarioStrategy):\n",

doc/code/scenarios/0_scenarios.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@
105105
from pyrit.scenario.core.matrix_atomic_attack_builder import build_matrix_atomic_attacks
106106
from pyrit.score.true_false.true_false_scorer import TrueFalseScorer
107107
from pyrit.setup import initialize_pyrit_async
108-
from pyrit.setup.initializers.components import ScenarioTechniqueInitializer
108+
from pyrit.setup.initializers.techniques import TechniqueInitializer
109109

110110
await initialize_pyrit_async(memory_db_type="InMemory") # type: ignore [top-level-await]
111-
await ScenarioTechniqueInitializer().initialize_async() # type: ignore [top-level-await]
111+
await TechniqueInitializer().initialize_async() # type: ignore [top-level-await]
112112

113113

114114
class MyStrategy(ScenarioStrategy):

doc/code/scenarios/2_custom_scenario_parameters.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@
7878
"source": [
7979
"from pyrit.scenario.airt.scam import Scam\n",
8080
"from pyrit.setup import initialize_pyrit_async\n",
81-
"from pyrit.setup.initializers.components import ScenarioTechniqueInitializer\n",
81+
"from pyrit.setup.initializers.techniques import TechniqueInitializer\n",
8282
"\n",
8383
"await initialize_pyrit_async(memory_db_type=\"InMemory\") # type: ignore [top-level-await]\n",
84-
"await ScenarioTechniqueInitializer().initialize_async() # type: ignore [top-level-await]\n",
84+
"await TechniqueInitializer().initialize_async() # type: ignore [top-level-await]\n",
8585
"\n",
8686
"for param in Scam.supported_parameters():\n",
8787
" print(param)"

doc/code/scenarios/2_custom_scenario_parameters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@
4949
# %%
5050
from pyrit.scenario.airt.scam import Scam
5151
from pyrit.setup import initialize_pyrit_async
52-
from pyrit.setup.initializers.components import ScenarioTechniqueInitializer
52+
from pyrit.setup.initializers.techniques import TechniqueInitializer
5353

5454
await initialize_pyrit_async(memory_db_type="InMemory") # type: ignore [top-level-await]
55-
await ScenarioTechniqueInitializer().initialize_async() # type: ignore [top-level-await]
55+
await TechniqueInitializer().initialize_async() # type: ignore [top-level-await]
5656

5757
for param in Scam.supported_parameters():
5858
print(param)

doc/code/setup/0_setup.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ PyRIT setup involves three main components to get you started with security test
88

99
## Quick Start
1010

11-
For the fastest setup, use the `SimpleInitializer` which requires only basic OpenAI environment variables:
11+
For the fastest setup, use `TargetInitializer` and `ScorerInitializer`, which require only basic OpenAI environment variables:
1212

1313
```python
1414
from pyrit.setup import initialize_pyrit_async
15-
from pyrit.setup.initializers import SimpleInitializer
15+
from pyrit.setup.initializers import ScorerInitializer, TargetInitializer
1616

17-
await initialize_pyrit_async(memory_db_type="InMemory", initializers=[SimpleInitializer()])
17+
await initialize_pyrit_async(memory_db_type="InMemory", initializers=[TargetInitializer(), ScorerInitializer()])
1818
```
1919

2020
This configuration allows you to run most PyRIT notebooks immediately.

doc/code/setup/1_configuration.ipynb

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
"source": [
115115
"## Simple Example\n",
116116
"\n",
117-
"This section goes into each of the three steps mentioned earlier. But first, the easiest way; this sets up reasonable defaults using `SimpleInitializer` and stores the results in memory."
117+
"This section goes into each of the three steps mentioned earlier. But first, the easiest way; this sets up reasonable defaults using `TargetInitializer` and `ScorerInitializer` and stores the results in memory."
118118
]
119119
},
120120
{
@@ -138,9 +138,9 @@
138138
"# E.g. you can put it in .env\n",
139139
"\n",
140140
"from pyrit.setup import initialize_pyrit_async\n",
141-
"from pyrit.setup.initializers import SimpleInitializer\n",
141+
"from pyrit.setup.initializers import ScorerInitializer, TargetInitializer\n",
142142
"\n",
143-
"await initialize_pyrit_async(memory_db_type=\"InMemory\", initializers=[SimpleInitializer()]) # type: ignore\n",
143+
"await initialize_pyrit_async(memory_db_type=\"InMemory\", initializers=[TargetInitializer(), ScorerInitializer()]) # type: ignore\n",
144144
"\n",
145145
"# Now you can run most of our notebooks! Just remove any os.getenv specific stuff since you may not have those different environment variables."
146146
]
@@ -505,23 +505,22 @@
505505
")\n",
506506
"from pyrit.prompt_target import OpenAIChatTarget\n",
507507
"from pyrit.setup import initialize_pyrit_async\n",
508-
"from pyrit.setup.initializers import SimpleInitializer\n",
508+
"from pyrit.setup.initializers import ScorerInitializer, TargetInitializer\n",
509509
"\n",
510-
"# This is a way to include the SimpleInitializer class directly\n",
511-
"await initialize_pyrit_async(memory_db_type=\"InMemory\", initializers=[SimpleInitializer()]) # type: ignore\n",
510+
"# This is a way to include the initializer classes directly\n",
511+
"await initialize_pyrit_async(memory_db_type=\"InMemory\", initializers=[TargetInitializer(), ScorerInitializer()]) # type: ignore\n",
512512
"\n",
513-
"# Alternative approach - you can pass the path to the initializer class.\n",
514-
"# This is how you provide your own file not part of the repo that defines a PyRITInitializer class\n",
515-
"# This is equivalent to loading the class directly as above\n",
513+
"# Alternative approach - you can pass the path to a file that defines PyRITInitializer classes.\n",
514+
"# This is how you provide your own file not part of the repo. Here we point at the built-in\n",
515+
"# targets module, which defines TargetInitializer.\n",
516516
"await initialize_pyrit_async(\n",
517-
" memory_db_type=\"InMemory\", initialization_scripts=[f\"{PYRIT_PATH}/setup/initializers/simple.py\"]\n",
517+
" memory_db_type=\"InMemory\", initialization_scripts=[f\"{PYRIT_PATH}/setup/initializers/targets.py\"]\n",
518518
") # type: ignore\n",
519519
"\n",
520-
"# SimpleInitializer is a class that initializes sensible defaults for someone who only has OPENAI_CHAT_ENDPOINT, OPENAI_CHAT_MODEL, and OPENAI_CHAT_KEY configured\n",
521-
"# It is meant to only require these two env vars to be configured\n",
522-
"# It can easily be swapped for another PyRITInitializer, like AIRTInitializer which is better but requires more env configuration\n",
520+
"# TargetInitializer registers sensible default targets for someone who only has OPENAI_CHAT_ENDPOINT, OPENAI_CHAT_MODEL, and OPENAI_CHAT_KEY configured\n",
521+
"# It can easily be combined with other PyRITInitializers (like ScorerInitializer) for a fuller setup\n",
523522
"# get_info_async() is a class method that shows how this initializer configures defaults and what global variables it sets\n",
524-
"info = await SimpleInitializer.get_info_async() # type: ignore\n",
523+
"info = await TargetInitializer.get_info_async() # type: ignore\n",
525524
"for key, value in info.items():\n",
526525
" print(f\"{key}: {value}\")\n",
527526
"\n",

0 commit comments

Comments
 (0)