Skip to content

Commit 1cb87a5

Browse files
rlundeen2Copilot
andauthored
MAINT Breaking: Migrating target and scorer registries (#2087)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent fe4383b commit 1cb87a5

56 files changed

Lines changed: 1396 additions & 1172 deletions

Some content is hidden

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

build_scripts/evaluate_scorers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ async def evaluate_scorers(tags: list[str] | None = None, max_concurrency: int =
6161
if tags:
6262
scorer_names: list[str] = []
6363
for tag in tags:
64-
entries = registry.get_by_tag(tag=tag)
64+
entries = registry.instances.get_by_tag(tag=tag)
6565
scorer_names.extend(entry.name for entry in entries if entry.name not in scorer_names)
6666
scorer_names.sort()
6767
print(f"\nFiltering by tags: {tags}")
6868
else:
69-
scorer_names = registry.get_names()
69+
scorer_names = registry.instances.get_names()
7070

7171
if not scorer_names:
7272
print("No scorers registered. Check environment variable configuration.")
@@ -85,7 +85,7 @@ async def evaluate_scorers(tags: list[str] | None = None, max_concurrency: int =
8585

8686
# Evaluate each scorer
8787
for i, scorer_name in scorer_iterator:
88-
scorer = registry.get_instance_by_name(scorer_name)
88+
scorer = registry.instances.get(scorer_name)
8989
print(f"\n[{i}/{len(scorer_names)}] Evaluating {scorer_name}...")
9090
print(" Status: Starting evaluation (this may take several minutes)...")
9191

doc/code/registry/2_instance_registry.ipynb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"source": [
2323
"## Listing Available Instances\n",
2424
"\n",
25-
"Use `get_names()` to see registered instances, or `list_metadata()` for details."
25+
"Use `instances.get_names()` to see registered instances, or `instances.list_metadata()` for details."
2626
]
2727
},
2828
{
@@ -69,10 +69,10 @@
6969
"# Register a scorer instance for demonstration\n",
7070
"chat_target = OpenAIChatTarget()\n",
7171
"refusal_scorer = SelfAskRefusalScorer(chat_target=chat_target)\n",
72-
"registry.register_instance(refusal_scorer)\n",
72+
"registry.instances.register(refusal_scorer)\n",
7373
"\n",
7474
"# List what's available\n",
75-
"names = registry.get_names()\n",
75+
"names = registry.instances.get_names()\n",
7676
"print(f\"Registered scorers: {names}\")"
7777
]
7878
},
@@ -83,7 +83,7 @@
8383
"source": [
8484
"## Getting an Instance\n",
8585
"\n",
86-
"Use `get()` to retrieve a pre-configured instance by name. The instance is ready to use immediately."
86+
"Use `instances.get()` to retrieve a pre-configured instance by name. The instance is ready to use immediately."
8787
]
8888
},
8989
{
@@ -105,7 +105,7 @@
105105
"# Get the first registered scorer\n",
106106
"if names:\n",
107107
" scorer_name = names[0]\n",
108-
" scorer = registry.get(scorer_name)\n",
108+
" scorer = registry.instances.get(scorer_name)\n",
109109
" print(f\"Retrieved scorer: {scorer}\")\n",
110110
" print(f\"Scorer type: {type(scorer).__name__}\")"
111111
]
@@ -151,7 +151,7 @@
151151
"from pyrit.output import output_scorer_async\n",
152152
"\n",
153153
"# Get metadata for all registered scorers\n",
154-
"metadata = registry.list_metadata()\n",
154+
"metadata = registry.instances.list_metadata()\n",
155155
"for item in metadata:\n",
156156
" print(f\"\\n{item.unique_name}:\")\n",
157157
" print(f\" Class: {item.class_name}\")\n",
@@ -188,15 +188,15 @@
188188
],
189189
"source": [
190190
"# Filter by scorer_type (based on isinstance check against TrueFalseScorer/FloatScaleScorer)\n",
191-
"true_false_scorers = registry.list_metadata(include_filters={\"scorer_type\": \"true_false\"})\n",
191+
"true_false_scorers = registry.instances.list_metadata(include_filters={\"scorer_type\": \"true_false\"})\n",
192192
"print(f\"True/False scorers: {[m.unique_name for m in true_false_scorers]}\")\n",
193193
"\n",
194194
"# Filter by class_name\n",
195-
"refusal_scorers = registry.list_metadata(include_filters={\"class_name\": \"SelfAskRefusalScorer\"})\n",
195+
"refusal_scorers = registry.instances.list_metadata(include_filters={\"class_name\": \"SelfAskRefusalScorer\"})\n",
196196
"print(f\"Refusal scorers: {[m.unique_name for m in refusal_scorers]}\")\n",
197197
"\n",
198198
"# Combine multiple filters (AND logic)\n",
199-
"specific_scorers = registry.list_metadata(\n",
199+
"specific_scorers = registry.instances.list_metadata(\n",
200200
" include_filters={\"scorer_type\": \"true_false\", \"class_name\": \"SelfAskRefusalScorer\"}\n",
201201
")\n",
202202
"print(f\"True/False refusal scorers: {[m.unique_name for m in specific_scorers]}\")"
@@ -248,7 +248,7 @@
248248
"# Get the registry singleton\n",
249249
"registry = TargetRegistry.get_registry_singleton()\n",
250250
"# List registered targets\n",
251-
"target_names = registry.get_names()\n",
251+
"target_names = registry.instances.get_names()\n",
252252
"print(f\"Registered targets after initialization: {target_names}\")"
253253
]
254254
}

doc/code/registry/2_instance_registry.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
# %% [markdown]
2222
# ## Listing Available Instances
2323
#
24-
# Use `get_names()` to see registered instances, or `list_metadata()` for details.
24+
# Use `instances.get_names()` to see registered instances, or `instances.list_metadata()` for details.
2525

2626
# %%
2727
from pyrit.prompt_target import OpenAIChatTarget
@@ -37,22 +37,22 @@
3737
# Register a scorer instance for demonstration
3838
chat_target = OpenAIChatTarget()
3939
refusal_scorer = SelfAskRefusalScorer(chat_target=chat_target)
40-
registry.register_instance(refusal_scorer)
40+
registry.instances.register(refusal_scorer)
4141

4242
# List what's available
43-
names = registry.get_names()
43+
names = registry.instances.get_names()
4444
print(f"Registered scorers: {names}")
4545

4646
# %% [markdown]
4747
# ## Getting an Instance
4848
#
49-
# Use `get()` to retrieve a pre-configured instance by name. The instance is ready to use immediately.
49+
# Use `instances.get()` to retrieve a pre-configured instance by name. The instance is ready to use immediately.
5050

5151
# %%
5252
# Get the first registered scorer
5353
if names:
5454
scorer_name = names[0]
55-
scorer = registry.get(scorer_name)
55+
scorer = registry.instances.get(scorer_name)
5656
print(f"Retrieved scorer: {scorer}")
5757
print(f"Scorer type: {type(scorer).__name__}")
5858

@@ -65,7 +65,7 @@
6565
from pyrit.output import output_scorer_async
6666

6767
# Get metadata for all registered scorers
68-
metadata = registry.list_metadata()
68+
metadata = registry.instances.list_metadata()
6969
for item in metadata:
7070
print(f"\n{item.unique_name}:")
7171
print(f" Class: {item.class_name}")
@@ -80,15 +80,15 @@
8080

8181
# %%
8282
# Filter by scorer_type (based on isinstance check against TrueFalseScorer/FloatScaleScorer)
83-
true_false_scorers = registry.list_metadata(include_filters={"scorer_type": "true_false"})
83+
true_false_scorers = registry.instances.list_metadata(include_filters={"scorer_type": "true_false"})
8484
print(f"True/False scorers: {[m.unique_name for m in true_false_scorers]}")
8585

8686
# Filter by class_name
87-
refusal_scorers = registry.list_metadata(include_filters={"class_name": "SelfAskRefusalScorer"})
87+
refusal_scorers = registry.instances.list_metadata(include_filters={"class_name": "SelfAskRefusalScorer"})
8888
print(f"Refusal scorers: {[m.unique_name for m in refusal_scorers]}")
8989

9090
# Combine multiple filters (AND logic)
91-
specific_scorers = registry.list_metadata(
91+
specific_scorers = registry.instances.list_metadata(
9292
include_filters={"scorer_type": "true_false", "class_name": "SelfAskRefusalScorer"}
9393
)
9494
print(f"True/False refusal scorers: {[m.unique_name for m in specific_scorers]}")
@@ -111,5 +111,5 @@
111111
# Get the registry singleton
112112
registry = TargetRegistry.get_registry_singleton()
113113
# List registered targets
114-
target_names = registry.get_names()
114+
target_names = registry.instances.get_names()
115115
print(f"Registered targets after initialization: {target_names}")

doc/code/scenarios/0_scenarios.ipynb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,8 @@
336336
" ``supported_parameters``). Each target must already be registered in\n",
337337
" ``TargetRegistry`` — typically by ``TargetInitializer`` from\n",
338338
" ``ADVERSARIAL_CHAT_*`` env vars, or programmatically via\n",
339-
" ``TargetRegistry.register_instance``. At run time,\n",
340-
" ``_get_atomic_attacks_async`` performs the ``(technique ×\n",
339+
" ``TargetRegistry.get_registry_singleton().instances.register``. At run\n",
340+
" time, ``_get_atomic_attacks_async`` performs the ``(technique ×\n",
341341
" adversarial_target × dataset)`` cross-product: for each selected\n",
342342
" adversarial-capable ``core`` factory in the ``AttackTechniqueRegistry``\n",
343343
" and each requested target, it calls\n",
@@ -356,7 +356,7 @@
356356
" Default Datasets (1, max 8 per dataset):\n",
357357
" harmbench\n",
358358
" Supported Parameters:\n",
359-
" - adversarial_targets (list[str]): Registry names of adversarial chat targets to benchmark. Each name must already be registered in TargetRegistry (via TargetInitializer or TargetRegistry.register_instance). Use 'pyrit_scan list-targets' to see registered targets. Settable via --adversarial-targets <name> [<name> ...] on the CLI, or scenario.args.adversarial_targets in .pyrit_conf.\n",
359+
" - adversarial_targets (list[str]): Registry names of adversarial chat targets to benchmark. Each name must already be registered in TargetRegistry (via TargetInitializer or TargetRegistry instance registration). Use 'pyrit_scan list-targets' to see registered targets. Settable via --adversarial-targets <name> [<name> ...] on the CLI, or scenario.args.adversarial_targets in .pyrit_conf.\n",
360360
"\u001b[1m\u001b[36m\n",
361361
" foundry.red_team_agent\u001b[0m\n",
362362
" Class: RedTeamAgent\n",

doc/code/scenarios/1_common_scenario_parameters.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
"\n",
8686
"await initialize_from_config_async(config_path=Path(\"../../scanner/pyrit_conf.yaml\")) # type: ignore\n",
8787
"\n",
88-
"objective_target = TargetRegistry.get_registry_singleton().get_instance_by_name(\"openai_chat\")"
88+
"objective_target = TargetRegistry.get_registry_singleton().instances.get(\"openai_chat\")"
8989
]
9090
},
9191
{

doc/code/scenarios/1_common_scenario_parameters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
await initialize_from_config_async(config_path=Path("../../scanner/pyrit_conf.yaml")) # type: ignore
3737

38-
objective_target = TargetRegistry.get_registry_singleton().get_instance_by_name("openai_chat")
38+
objective_target = TargetRegistry.get_registry_singleton().instances.get("openai_chat")
3939
# %% [markdown]
4040
# ## Dataset Configuration
4141
#

doc/code/scenarios/3_adaptive_scenarios.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@
115115
"\n",
116116
"await initialize_from_config_async(config_path=Path(\"../../scanner/pyrit_conf.yaml\")) # type: ignore\n",
117117
"\n",
118-
"objective_target = TargetRegistry.get_registry_singleton().get_instance_by_name(\"openai_chat\")\n",
118+
"objective_target = TargetRegistry.get_registry_singleton().instances.get(\"openai_chat\")\n",
119119
"printer = ConsoleScenarioResultPrinter()"
120120
]
121121
},

doc/code/scenarios/3_adaptive_scenarios.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
await initialize_from_config_async(config_path=Path("../../scanner/pyrit_conf.yaml")) # type: ignore
5656

57-
objective_target = TargetRegistry.get_registry_singleton().get_instance_by_name("openai_chat")
57+
objective_target = TargetRegistry.get_registry_singleton().instances.get("openai_chat")
5858
printer = ConsoleScenarioResultPrinter()
5959

6060
# %% [markdown]

doc/scanner/foundry.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
"\n",
5151
"await initialize_from_config_async(config_path=Path(\"pyrit_conf.yaml\")) # type: ignore\n",
5252
"\n",
53-
"objective_target = TargetRegistry.get_registry_singleton().get_instance_by_name(\"openai_chat\")"
53+
"objective_target = TargetRegistry.get_registry_singleton().instances.get(\"openai_chat\")"
5454
]
5555
},
5656
{

doc/scanner/foundry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
await initialize_from_config_async(config_path=Path("pyrit_conf.yaml")) # type: ignore
3232

33-
objective_target = TargetRegistry.get_registry_singleton().get_instance_by_name("openai_chat")
33+
objective_target = TargetRegistry.get_registry_singleton().instances.get("openai_chat")
3434
# %% [markdown]
3535
# ## RedTeamAgent
3636
#

0 commit comments

Comments
 (0)