Skip to content
Open
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
10 changes: 10 additions & 0 deletions .env_example
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ AZURE_OPENAI_GPT4_CHAT_ENDPOINT="https://xxxxx.openai.azure.com/openai/v1"
AZURE_OPENAI_GPT4_CHAT_KEY="xxxxx"
AZURE_OPENAI_GPT4_CHAT_MODEL="deployment-name"

# Endpoints that host models with fewer safety mechanisms (e.g. via adversarial fine tuning
# or content filters turned off) can be defined below and used in adversarial attack testing scenarios.
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_ENDPOINT="https://xxxxx.openai.azure.com/openai/v1"
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_KEY="xxxxx"
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_MODEL="deployment-name"

AZURE_OPENAI_GPT4O_UNSAFE_CHAT_ENDPOINT2="https://xxxxx.openai.azure.com/openai/v1"
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_KEY2="xxxxx"
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_MODEL2="deployment-name"

AZURE_FOUNDRY_DEEPSEEK_ENDPOINT="https://xxxxx.eastus2.models.ai.azure.com"
AZURE_FOUNDRY_DEEPSEEK_KEY="xxxxx"

Expand Down
1 change: 1 addition & 0 deletions doc/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,7 @@ API Reference

PyRITInitializer
AIRTInitializer
AIRTTargetInitializer
SimpleInitializer
LoadDefaultDatasets
ScenarioObjectiveListInitializer
76 changes: 59 additions & 17 deletions doc/code/registry/2_instance_registry.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Found default environment files: ['C:\\\\Users\\\\rlundeen\\\\.pyrit\\\\.env', 'C:\\\\Users\\\\rlundeen\\\\.pyrit\\\\.env.local']\n",
"Loaded environment file: C:\\Users\\rlundeen\\.pyrit\\.env\n",
"Loaded environment file: C:\\Users\\rlundeen\\.pyrit\\.env.local\n",
"Registered scorers: ['self_ask_refusal_d9007ba2']\n"
"Found default environment files: ['C:\\\\Users\\\\songjustin\\\\.pyrit\\\\.env']\n",
"Loaded environment file: C:\\Users\\songjustin\\.pyrit\\.env\n",
"Registered scorers: ['self_ask_refusal_scorer::94a582f5']\n"
]
}
],
Expand Down Expand Up @@ -83,7 +82,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Retrieved scorer: <pyrit.score.true_false.self_ask_refusal_scorer.SelfAskRefusalScorer object at 0x0000026BFBE69A90>\n",
"Retrieved scorer: <pyrit.score.true_false.self_ask_refusal_scorer.SelfAskRefusalScorer object at 0x000001CB7FF57350>\n",
"Scorer type: SelfAskRefusalScorer\n"
]
}
Expand Down Expand Up @@ -118,15 +117,15 @@
"output_type": "stream",
"text": [
"\n",
"self_ask_refusal_d9007ba2:\n",
"self_ask_refusal_scorer::94a582f5:\n",
" Class: SelfAskRefusalScorer\n",
" Type: true_false\n",
" Description: A self-ask scorer that detects refusal in AI responses. This...\n",
"\n",
"\u001b[1m 📊 Scorer Information\u001b[0m\n",
"\u001b[37m ▸ Scorer Identifier\u001b[0m\n",
"\u001b[36m • Scorer Type: SelfAskRefusalScorer\u001b[0m\n",
"\u001b[36m • Target Model: gpt-40\u001b[0m\n",
"\u001b[36m • Target Model: gpt-4o\u001b[0m\n",
"\u001b[36m • Temperature: None\u001b[0m\n",
"\u001b[36m • Score Aggregator: OR_\u001b[0m\n",
"\n",
Expand All @@ -141,12 +140,12 @@
"# Get metadata for all registered scorers\n",
"metadata = registry.list_metadata()\n",
"for item in metadata:\n",
" print(f\"\\n{item.name}:\")\n",
" print(f\"\\n{item.unique_name}:\")\n",
" print(f\" Class: {item.class_name}\")\n",
" print(f\" Type: {item.scorer_type}\")\n",
" print(f\" Description: {item.description[:60]}...\")\n",
" print(f\" Description: {item.class_description[:60]}...\")\n",
"\n",
" ConsoleScorerPrinter().print_objective_scorer(scorer_identifier=item.scorer_identifier)"
" ConsoleScorerPrinter().print_objective_scorer(scorer_identifier=item)"
]
},
{
Expand All @@ -169,26 +168,69 @@
"name": "stdout",
"output_type": "stream",
"text": [
"True/False scorers: ['self_ask_refusal_d9007ba2']\n",
"Refusal scorers: ['self_ask_refusal_d9007ba2']\n",
"True/False refusal scorers: ['self_ask_refusal_d9007ba2']\n"
"True/False scorers: ['self_ask_refusal_scorer::94a582f5']\n",
"Refusal scorers: ['self_ask_refusal_scorer::94a582f5']\n",
"True/False refusal scorers: ['self_ask_refusal_scorer::94a582f5']\n"
]
}
],
"source": [
"# Filter by scorer_type (based on isinstance check against TrueFalseScorer/FloatScaleScorer)\n",
"true_false_scorers = registry.list_metadata(include_filters={\"scorer_type\": \"true_false\"})\n",
"print(f\"True/False scorers: {[m.name for m in true_false_scorers]}\")\n",
"print(f\"True/False scorers: {[m.unique_name for m in true_false_scorers]}\")\n",
"\n",
"# Filter by class_name\n",
"refusal_scorers = registry.list_metadata(include_filters={\"class_name\": \"SelfAskRefusalScorer\"})\n",
"print(f\"Refusal scorers: {[m.name for m in refusal_scorers]}\")\n",
"print(f\"Refusal scorers: {[m.unique_name for m in refusal_scorers]}\")\n",
"\n",
"# Combine multiple filters (AND logic)\n",
"specific_scorers = registry.list_metadata(\n",
" include_filters={\"scorer_type\": \"true_false\", \"class_name\": \"SelfAskRefusalScorer\"}\n",
")\n",
"print(f\"True/False refusal scorers: {[m.name for m in specific_scorers]}\")"
"print(f\"True/False refusal scorers: {[m.unique_name for m in specific_scorers]}\")"
]
},
{
"cell_type": "markdown",
"id": "9",
"metadata": {},
"source": [
"## Using Target Initializer\n",
"\n",
"You can optionally use the `AIRTTargetInitializer` to automatically configure and register targets that use commonly used environment variables (from `.env_example`). This initializer does not strictly require any environment variables - it simply registers whatever endpoints are available."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "10",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found default environment files: ['C:\\\\Users\\\\songjustin\\\\.pyrit\\\\.env']\n",
"Loaded environment file: C:\\Users\\songjustin\\.pyrit\\.env\n",
"Registered targets after AIRT initialization: ['azure_content_safety', 'azure_gpt4o_unsafe_chat', 'azure_gpt4o_unsafe_chat2', 'default_openai_frontend', 'openai_chat', 'openai_image', 'openai_realtime', 'openai_responses', 'openai_tts', 'openai_video']\n"
]
}
],
"source": [
"from pyrit.registry import TargetRegistry\n",
"from pyrit.setup import initialize_pyrit_async\n",
"from pyrit.setup.initializers import AIRTTargetInitializer\n",
"\n",
"# Using built-in initializer\n",
"await initialize_pyrit_async( # type: ignore\n",
" memory_db_type=\"InMemory\", initializers=[AIRTTargetInitializer()]\n",
")\n",
"\n",
"# Get the registry singleton\n",
"registry = TargetRegistry.get_registry_singleton()\n",
"# List registered targets\n",
"target_names = registry.get_names()\n",
"print(f\"Registered targets after AIRT initialization: {target_names}\")"
]
}
],
Expand All @@ -203,7 +245,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.5"
"version": "3.11.9"
}
},
"nbformat": 4,
Expand Down
43 changes: 34 additions & 9 deletions doc/code/registry/2_instance_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
# extension: .py
# format_name: percent
# format_version: '1.3'
# jupytext_version: 1.18.1
# jupytext_version: 1.17.2
# kernelspec:
# display_name: pyrit-dev
# language: python
# name: python3
# ---

# %% [markdown]
# ## Why Instance Registries?
# # Why Instance Registries?
#
# Some components need configuration that can't easily be passed at instantiation time. For example, scorers often need:
# - A configured `chat_target` for LLM-based scoring
Expand All @@ -19,7 +23,7 @@
# Instance registries let initializers register fully-configured instances that are ready to use.

# %% [markdown]
# # Listing Available Instances
# ## Listing Available Instances
#
# Use `get_names()` to see registered instances, or `list_metadata()` for details.

Expand Down Expand Up @@ -67,12 +71,12 @@
# Get metadata for all registered scorers
metadata = registry.list_metadata()
for item in metadata:
print(f"\n{item.name}:")
print(f"\n{item.unique_name}:")
print(f" Class: {item.class_name}")
print(f" Type: {item.scorer_type}")
print(f" Description: {item.description[:60]}...")
print(f" Description: {item.class_description[:60]}...")

ConsoleScorerPrinter().print_objective_scorer(scorer_identifier=item.scorer_identifier)
ConsoleScorerPrinter().print_objective_scorer(scorer_identifier=item)

# %% [markdown]
# ## Filtering
Expand All @@ -82,14 +86,35 @@
# %%
# Filter by scorer_type (based on isinstance check against TrueFalseScorer/FloatScaleScorer)
true_false_scorers = registry.list_metadata(include_filters={"scorer_type": "true_false"})
print(f"True/False scorers: {[m.name for m in true_false_scorers]}")
print(f"True/False scorers: {[m.unique_name for m in true_false_scorers]}")

# Filter by class_name
refusal_scorers = registry.list_metadata(include_filters={"class_name": "SelfAskRefusalScorer"})
print(f"Refusal scorers: {[m.name for m in refusal_scorers]}")
print(f"Refusal scorers: {[m.unique_name for m in refusal_scorers]}")

# Combine multiple filters (AND logic)
specific_scorers = registry.list_metadata(
include_filters={"scorer_type": "true_false", "class_name": "SelfAskRefusalScorer"}
)
print(f"True/False refusal scorers: {[m.name for m in specific_scorers]}")
print(f"True/False refusal scorers: {[m.unique_name for m in specific_scorers]}")

# %% [markdown]
# ## Using Target Initializer
#
# You can optionally use the `AIRTTargetInitializer` to automatically configure and register targets that use commonly used environment variables (from `.env_example`). This initializer does not strictly require any environment variables - it simply registers whatever endpoints are available.

# %%
from pyrit.registry import TargetRegistry
from pyrit.setup import initialize_pyrit_async
from pyrit.setup.initializers import AIRTTargetInitializer

# Using built-in initializer
await initialize_pyrit_async( # type: ignore
memory_db_type="InMemory", initializers=[AIRTTargetInitializer()]
)

# Get the registry singleton
registry = TargetRegistry.get_registry_singleton()
# List registered targets
target_names = registry.get_names()
print(f"Registered targets after AIRT initialization: {target_names}")
3 changes: 3 additions & 0 deletions pyrit/identifiers/target_identifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ class TargetIdentifier(Identifier):
max_requests_per_minute: Optional[int] = None
"""Maximum number of requests per minute."""

supports_conversation_history: bool = False
"""Whether the target supports explicit setting of conversation history (is a PromptChatTarget)."""

target_specific_params: Optional[Dict[str, Any]] = None
"""Additional target-specific parameters."""

Expand Down
4 changes: 4 additions & 0 deletions pyrit/prompt_target/common/prompt_target.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@ def _create_identifier(
elif self._model_name:
model_name = self._model_name

# Late import to avoid circular dependency
from pyrit.prompt_target.common.prompt_chat_target import PromptChatTarget

return TargetIdentifier(
class_name=self.__class__.__name__,
class_module=self.__class__.__module__,
Expand All @@ -132,6 +135,7 @@ def _create_identifier(
temperature=temperature,
top_p=top_p,
max_requests_per_minute=self._max_requests_per_minute,
supports_conversation_history=isinstance(self, PromptChatTarget),
target_specific_params=target_specific_params,
)

Expand Down
2 changes: 2 additions & 0 deletions pyrit/registry/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from pyrit.registry.instance_registries import (
BaseInstanceRegistry,
ScorerRegistry,
TargetRegistry,
)

__all__ = [
Expand All @@ -39,4 +40,5 @@
"ScenarioMetadata",
"ScenarioRegistry",
"ScorerRegistry",
"TargetRegistry",
]
4 changes: 4 additions & 0 deletions pyrit/registry/instance_registries/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@
from pyrit.registry.instance_registries.scorer_registry import (
ScorerRegistry,
)
from pyrit.registry.instance_registries.target_registry import (
TargetRegistry,
)

__all__ = [
# Base class
"BaseInstanceRegistry",
# Concrete registries
"ScorerRegistry",
"TargetRegistry",
]
Loading