Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions doc/code/registry/0_registry.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ PyRIT has two registry patterns for different use cases:
| **Class Registry** | Classes (type[T]) | Components instantiated with user-provided parameters |
| **Instance Registry** | Pre-configured instances | Components requiring complex setup before use |

## Common API (RegistryProtocol)
## Common API

Both registry types implement `RegistryProtocol`, sharing a consistent interface:
Registries share a consistent interface for discovery and introspection:

| Method | Description |
|--------|-------------|
Expand All @@ -29,14 +29,17 @@ Both registry types implement `RegistryProtocol`, sharing a consistent interface
| `list_metadata()` | Get descriptive metadata for all items |
| `reset_instance()` | Reset the singleton (useful for testing) |

This protocol enables writing code that works with any registry type:
This makes it easy to write code that inspects any registry:

```python
from pyrit.registry import RegistryProtocol
from pyrit.registry import ScenarioRegistry

def show_registry_contents(registry: RegistryProtocol) -> None:
def show_registry_contents(registry) -> None:
for name in registry.get_names():
print(name)


show_registry_contents(ScenarioRegistry.get_registry_singleton())
```


Expand Down
10 changes: 5 additions & 5 deletions doc/code/registry/1_class_registry.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"source": [
"# Listing Available Classes\n",
"\n",
"Use `get_names()` to see what's available, or `list_metadata()` for detailed information."
"Use `get_class_names()` to see what's available, or `get_all_registered_class_metadata()` for detailed information."
]
},
{
Expand Down Expand Up @@ -36,11 +36,11 @@
"registry = ScenarioRegistry.get_registry_singleton()\n",
"\n",
"# Get all registered names\n",
"names = registry.get_names()\n",
"names = registry.get_class_names()\n",
"print(f\"Available scenarios: {names[:5]}...\") # Show first 5\n",
"\n",
"# Get detailed metadata\n",
"metadata = registry.list_metadata()\n",
"metadata = registry.get_all_registered_class_metadata()\n",
"for item in metadata[:2]: # Show first 2\n",
" print(f\"\\n{item.class_name}:\")\n",
" print(f\" Description: {item.class_description[:80]}...\")"
Expand Down Expand Up @@ -226,11 +226,11 @@
"initializer_registry = InitializerRegistry.get_registry_singleton()\n",
"\n",
"# Get all registered names\n",
"initializer_names = initializer_registry.get_names()\n",
"initializer_names = initializer_registry.get_class_names()\n",
"print(f\"Available initializers: {initializer_names[:5]}...\") # Show first 5\n",
"\n",
"# Get detailed metadata\n",
"for init_item in initializer_registry.list_metadata()[:2]: # Show first 2\n",
"for init_item in initializer_registry.get_all_registered_class_metadata()[:2]: # Show first 2\n",
" print(f\"\\n{init_item.registry_name}:\")\n",
" print(f\" Class: {init_item.class_name}\")\n",
" print(f\" Description: {init_item.class_description[:80]}...\")"
Expand Down
10 changes: 5 additions & 5 deletions doc/code/registry/1_class_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@
# %% [markdown]
# # Listing Available Classes
#
# Use `get_names()` to see what's available, or `list_metadata()` for detailed information.
# Use `get_class_names()` to see what's available, or `get_all_registered_class_metadata()` for detailed information.

# %%
from pyrit.registry import ScenarioRegistry

registry = ScenarioRegistry.get_registry_singleton()

# Get all registered names
names = registry.get_names()
names = registry.get_class_names()
print(f"Available scenarios: {names[:5]}...") # Show first 5

# Get detailed metadata
metadata = registry.list_metadata()
metadata = registry.get_all_registered_class_metadata()
for item in metadata[:2]: # Show first 2
print(f"\n{item.class_name}:")
print(f" Description: {item.class_description[:80]}...")
Expand Down Expand Up @@ -92,11 +92,11 @@
initializer_registry = InitializerRegistry.get_registry_singleton()

# Get all registered names
initializer_names = initializer_registry.get_names()
initializer_names = initializer_registry.get_class_names()
print(f"Available initializers: {initializer_names[:5]}...") # Show first 5

# Get detailed metadata
for init_item in initializer_registry.list_metadata()[:2]: # Show first 2
for init_item in initializer_registry.get_all_registered_class_metadata()[:2]: # Show first 2
print(f"\n{init_item.registry_name}:")
print(f" Class: {init_item.class_name}")
print(f" Description: {init_item.class_description[:80]}...")
4 changes: 2 additions & 2 deletions pyrit/backend/services/initializer_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ async def list_initializers_async(
Returns:
ListRegisteredInitializersResponse with paginated initializer summaries.
"""
all_metadata = self._registry.list_metadata()
all_metadata = self._registry.get_all_registered_class_metadata()
all_summaries = [_metadata_to_registered_initializer(m) for m in all_metadata]

page, has_more = self._paginate(items=all_summaries, cursor=cursor, limit=limit)
Expand All @@ -90,7 +90,7 @@ async def get_initializer_async(self, *, initializer_name: str) -> RegisteredIni
Returns:
RegisteredInitializer if found, None otherwise.
"""
all_metadata = self._registry.list_metadata()
all_metadata = self._registry.get_all_registered_class_metadata()
for metadata in all_metadata:
if metadata.registry_name == initializer_name:
return _metadata_to_registered_initializer(metadata)
Expand Down
8 changes: 4 additions & 4 deletions pyrit/backend/services/scenario_run_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,13 +227,13 @@ async def _run_initializers_async(self, *, request: RunScenarioRequest) -> None:

initializer_registry = InitializerRegistry.get_registry_singleton()
for initializer_name in request.initializers:
initializer_params = (request.initializer_args or {}).get(initializer_name)
try:
initializer_class = initializer_registry.get_class(initializer_name)
instance = initializer_registry.create_and_configure(
initializer_name, initializer_params=initializer_params
)
except KeyError as e:
raise ValueError(f"Initializer not found: {e}") from None
instance = initializer_class()
if request.initializer_args and initializer_name in request.initializer_args:
instance.set_params_from_args(args=request.initializer_args[initializer_name])
await instance.initialize_async()

def _resolve_target(self, *, request: RunScenarioRequest) -> "PromptTarget":
Expand Down
28 changes: 6 additions & 22 deletions pyrit/registry/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,61 +3,45 @@

"""Registry module for PyRIT class and object registries."""

from pyrit.registry.base import RegistryProtocol
from pyrit.registry.class_registries import (
BaseClassRegistry,
ClassEntry,
InitializerMetadata,
InitializerRegistry,
)
from pyrit.registry.components import (
AttackTechniqueMetadata,
AttackTechniqueRegistry,
ConverterMetadata,
ConverterRegistry,
InitializerMetadata,
InitializerRegistry,
ScenarioMetadata,
ScenarioRegistry,
ScorerMetadata,
ScorerRegistry,
TargetMetadata,
TargetRegistry,
)
from pyrit.registry.discovery import (
discover_in_directory,
discover_in_package,
discover_subclasses_in_loaded_modules,
)
from pyrit.registry.discovery import discover_in_directory
from pyrit.registry.instance_registry import (
DefaultInstanceRegistry,
InstanceRegistry,
SupportsInstances,
)
from pyrit.registry.object_registries import (
BaseInstanceRegistry,
RegistryEntry,
SupportsInstances,
)
from pyrit.registry.registry import Registry
from pyrit.registry.registry_metadata import RegistryMetadata
from pyrit.registry.tag_query import TagQuery

__all__ = [
"AttackTechniqueRegistry",
"AttackTechniqueMetadata",
"BaseClassRegistry",
"BaseInstanceRegistry",
"ConverterRegistry",
"ConverterMetadata",
"DefaultInstanceRegistry",
"InstanceRegistry",
"Registry",
"RegistryMetadata",
"SupportsInstances",
"ClassEntry",
"discover_in_directory",
"discover_in_package",
"discover_subclasses_in_loaded_modules",
"InitializerMetadata",
"InitializerRegistry",
"RegistryEntry",
"RegistryProtocol",
"ScenarioMetadata",
"ScenarioRegistry",
"ScorerRegistry",
Expand Down
Loading
Loading