Source code for pyrit.setup.initializers.airt_targets

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

"""
AIRT Target Initializer for registering pre-configured targets from environment variables.

This module provides the AIRTTargetInitializer class that registers available
targets into the TargetRegistry based on environment variable configuration.

Note: This module only includes PRIMARY endpoint configurations from .env_example.
      Alias configurations (those using ${...} syntax) are excluded since they
      reference other primary configurations.
"""

import logging
import os
from dataclasses import dataclass
from typing import Any, List, Optional, Type

from pyrit.prompt_target import (
    AzureMLChatTarget,
    OpenAIChatTarget,
    OpenAICompletionTarget,
    OpenAIImageTarget,
    OpenAIResponseTarget,
    OpenAITTSTarget,
    OpenAIVideoTarget,
    PromptShieldTarget,
    PromptTarget,
    RealtimeTarget,
)
from pyrit.registry import TargetRegistry
from pyrit.setup.initializers.pyrit_initializer import PyRITInitializer

logger = logging.getLogger(__name__)


@dataclass
class TargetConfig:
    """Configuration for a target to be registered."""

    registry_name: str
    target_class: Type[PromptTarget]
    endpoint_var: str
    key_var: str = ""  # Empty string means no auth required
    model_var: Optional[str] = None
    underlying_model_var: Optional[str] = None


# Define all supported target configurations.
# Only PRIMARY configurations are included here - alias configurations that use ${...}
# syntax in .env_example are excluded since they reference other primary configurations.
TARGET_CONFIGS: List[TargetConfig] = [
    # ============================================
    # OpenAI Chat Targets (OpenAIChatTarget)
    # ============================================
    TargetConfig(
        registry_name="platform_openai_chat",
        target_class=OpenAIChatTarget,
        endpoint_var="PLATFORM_OPENAI_CHAT_ENDPOINT",
        key_var="PLATFORM_OPENAI_CHAT_API_KEY",
        model_var="PLATFORM_OPENAI_CHAT_GPT4O_MODEL",
    ),
    TargetConfig(
        registry_name="azure_openai_gpt4o",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_OPENAI_GPT4O_ENDPOINT",
        key_var="AZURE_OPENAI_GPT4O_KEY",
        model_var="AZURE_OPENAI_GPT4O_MODEL",
        underlying_model_var="AZURE_OPENAI_GPT4O_UNDERLYING_MODEL",
    ),
    TargetConfig(
        registry_name="azure_openai_integration_test",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_OPENAI_INTEGRATION_TEST_ENDPOINT",
        key_var="AZURE_OPENAI_INTEGRATION_TEST_KEY",
        model_var="AZURE_OPENAI_INTEGRATION_TEST_MODEL",
        underlying_model_var="AZURE_OPENAI_INTEGRATION_TEST_UNDERLYING_MODEL",
    ),
    TargetConfig(
        registry_name="azure_openai_gpt35_chat",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_OPENAI_GPT3_5_CHAT_ENDPOINT",
        key_var="AZURE_OPENAI_GPT3_5_CHAT_KEY",
        model_var="AZURE_OPENAI_GPT3_5_CHAT_MODEL",
        underlying_model_var="AZURE_OPENAI_GPT3_5_CHAT_UNDERLYING_MODEL",
    ),
    TargetConfig(
        registry_name="azure_openai_gpt4_chat",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_OPENAI_GPT4_CHAT_ENDPOINT",
        key_var="AZURE_OPENAI_GPT4_CHAT_KEY",
        model_var="AZURE_OPENAI_GPT4_CHAT_MODEL",
        underlying_model_var="AZURE_OPENAI_GPT4_CHAT_UNDERLYING_MODEL",
    ),
    TargetConfig(
        registry_name="azure_gpt4o_unsafe_chat",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_ENDPOINT",
        key_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_KEY",
        model_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_MODEL",
        underlying_model_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_UNDERLYING_MODEL",
    ),
    TargetConfig(
        registry_name="azure_gpt4o_unsafe_chat2",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_ENDPOINT2",
        key_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_KEY2",
        model_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_MODEL2",
        underlying_model_var="AZURE_OPENAI_GPT4O_UNSAFE_CHAT_UNDERLYING_MODEL2",
    ),
    TargetConfig(
        registry_name="azure_foundry_deepseek",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_FOUNDRY_DEEPSEEK_ENDPOINT",
        key_var="AZURE_FOUNDRY_DEEPSEEK_KEY",
        model_var="AZURE_FOUNDRY_DEEPSEEK_MODEL",
    ),
    TargetConfig(
        registry_name="azure_foundry_phi4",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_FOUNDRY_PHI4_ENDPOINT",
        key_var="AZURE_CHAT_PHI4_KEY",
        model_var="AZURE_FOUNDRY_PHI4_MODEL",
    ),
    TargetConfig(
        registry_name="azure_foundry_mistral_large",
        target_class=OpenAIChatTarget,
        endpoint_var="AZURE_FOUNDRY_MISTRAL_LARGE_ENDPOINT",
        key_var="AZURE_FOUNDRY_MISTRAL_LARGE_KEY",
        model_var="AZURE_FOUNDRY_MISTRAL_LARGE_MODEL",
    ),
    TargetConfig(
        registry_name="groq",
        target_class=OpenAIChatTarget,
        endpoint_var="GROQ_ENDPOINT",
        key_var="GROQ_KEY",
        model_var="GROQ_LLAMA_MODEL",
    ),
    TargetConfig(
        registry_name="open_router",
        target_class=OpenAIChatTarget,
        endpoint_var="OPEN_ROUTER_ENDPOINT",
        key_var="OPEN_ROUTER_KEY",
        model_var="OPEN_ROUTER_CLAUDE_MODEL",
    ),
    TargetConfig(
        registry_name="ollama",
        target_class=OpenAIChatTarget,
        endpoint_var="OLLAMA_CHAT_ENDPOINT",
        model_var="OLLAMA_MODEL",
    ),
    TargetConfig(
        registry_name="google_gemini",
        target_class=OpenAIChatTarget,
        endpoint_var="GOOGLE_GEMINI_ENDPOINT",
        key_var="GOOGLE_GEMINI_API_KEY",
        model_var="GOOGLE_GEMINI_MODEL",
    ),
    # ============================================
    # OpenAI Responses Targets (OpenAIResponseTarget)
    # ============================================
    TargetConfig(
        registry_name="azure_openai_gpt5_responses",
        target_class=OpenAIResponseTarget,
        endpoint_var="AZURE_OPENAI_GPT5_RESPONSES_ENDPOINT",
        key_var="AZURE_OPENAI_GPT5_KEY",
        model_var="AZURE_OPENAI_GPT5_MODEL",
        underlying_model_var="AZURE_OPENAI_GPT5_UNDERLYING_MODEL",
    ),
    TargetConfig(
        registry_name="platform_openai_responses",
        target_class=OpenAIResponseTarget,
        endpoint_var="PLATFORM_OPENAI_RESPONSES_ENDPOINT",
        key_var="PLATFORM_OPENAI_RESPONSES_KEY",
        model_var="PLATFORM_OPENAI_RESPONSES_MODEL",
    ),
    TargetConfig(
        registry_name="azure_openai_responses",
        target_class=OpenAIResponseTarget,
        endpoint_var="AZURE_OPENAI_RESPONSES_ENDPOINT",
        key_var="AZURE_OPENAI_RESPONSES_KEY",
        model_var="AZURE_OPENAI_RESPONSES_MODEL",
        underlying_model_var="AZURE_OPENAI_RESPONSES_UNDERLYING_MODEL",
    ),
    # ============================================
    # Realtime Targets (RealtimeTarget)
    # ============================================
    TargetConfig(
        registry_name="platform_openai_realtime",
        target_class=RealtimeTarget,
        endpoint_var="PLATFORM_OPENAI_REALTIME_ENDPOINT",
        key_var="PLATFORM_OPENAI_REALTIME_API_KEY",
        model_var="PLATFORM_OPENAI_REALTIME_MODEL",
    ),
    TargetConfig(
        registry_name="azure_openai_realtime",
        target_class=RealtimeTarget,
        endpoint_var="AZURE_OPENAI_REALTIME_ENDPOINT",
        key_var="AZURE_OPENAI_REALTIME_API_KEY",
        model_var="AZURE_OPENAI_REALTIME_MODEL",
        underlying_model_var="AZURE_OPENAI_REALTIME_UNDERLYING_MODEL",
    ),
    # ============================================
    # Image Targets (OpenAIImageTarget)
    # ============================================
    TargetConfig(
        registry_name="openai_image_azure",
        target_class=OpenAIImageTarget,
        endpoint_var="OPENAI_IMAGE_ENDPOINT1",
        key_var="OPENAI_IMAGE_API_KEY1",
        model_var="OPENAI_IMAGE_MODEL1",
        underlying_model_var="OPENAI_IMAGE_UNDERLYING_MODEL1",
    ),
    TargetConfig(
        registry_name="openai_image_platform",
        target_class=OpenAIImageTarget,
        endpoint_var="OPENAI_IMAGE_ENDPOINT2",
        key_var="OPENAI_IMAGE_API_KEY2",
        model_var="OPENAI_IMAGE_MODEL2",
        underlying_model_var="OPENAI_IMAGE_UNDERLYING_MODEL2",
    ),
    # ============================================
    # TTS Targets (OpenAITTSTarget)
    # ============================================
    TargetConfig(
        registry_name="openai_tts_azure",
        target_class=OpenAITTSTarget,
        endpoint_var="OPENAI_TTS_ENDPOINT1",
        key_var="OPENAI_TTS_KEY1",
        model_var="OPENAI_TTS_MODEL1",
        underlying_model_var="OPENAI_TTS_UNDERLYING_MODEL1",
    ),
    TargetConfig(
        registry_name="openai_tts_platform",
        target_class=OpenAITTSTarget,
        endpoint_var="OPENAI_TTS_ENDPOINT2",
        key_var="OPENAI_TTS_KEY2",
        model_var="OPENAI_TTS_MODEL2",
        underlying_model_var="OPENAI_TTS_UNDERLYING_MODEL2",
    ),
    # ============================================
    # Video Targets (OpenAIVideoTarget)
    # ============================================
    TargetConfig(
        registry_name="azure_openai_video",
        target_class=OpenAIVideoTarget,
        endpoint_var="AZURE_OPENAI_VIDEO_ENDPOINT",
        key_var="AZURE_OPENAI_VIDEO_KEY",
        model_var="AZURE_OPENAI_VIDEO_MODEL",
        underlying_model_var="AZURE_OPENAI_VIDEO_UNDERLYING_MODEL",
    ),
    # ============================================
    # Completion Targets (OpenAICompletionTarget)
    # ============================================
    TargetConfig(
        registry_name="openai_completion",
        target_class=OpenAICompletionTarget,
        endpoint_var="OPENAI_COMPLETION_ENDPOINT",
        key_var="OPENAI_COMPLETION_API_KEY",
        model_var="OPENAI_COMPLETION_MODEL",
    ),
    # ============================================
    # Azure ML Targets (AzureMLChatTarget)
    # ============================================
    TargetConfig(
        registry_name="azure_ml_phi",
        target_class=AzureMLChatTarget,
        endpoint_var="AZURE_ML_PHI_ENDPOINT",
        key_var="AZURE_ML_PHI_KEY",
    ),
    # ============================================
    # Safety Targets (PromptShieldTarget)
    # ============================================
    TargetConfig(
        registry_name="azure_content_safety",
        target_class=PromptShieldTarget,
        endpoint_var="AZURE_CONTENT_SAFETY_API_ENDPOINT",
        key_var="AZURE_CONTENT_SAFETY_API_KEY",
    ),
]


[docs] class AIRTTargetInitializer(PyRITInitializer): """ AIRT Target Initializer for registering pre-configured targets. This initializer scans for known endpoint environment variables and registers the corresponding targets into the TargetRegistry. It only includes PRIMARY endpoint configurations - alias configurations (those using ${...} syntax in .env_example) are excluded since they reference other primary configurations. Supported Endpoints by Category: **OpenAI Chat Targets (OpenAIChatTarget):** - PLATFORM_OPENAI_CHAT_* - Platform OpenAI Chat API - AZURE_OPENAI_GPT4O_* - Azure OpenAI GPT-4o - AZURE_OPENAI_INTEGRATION_TEST_* - Integration test endpoint - AZURE_OPENAI_GPT3_5_CHAT_* - Azure OpenAI GPT-3.5 - AZURE_OPENAI_GPT4_CHAT_* - Azure OpenAI GPT-4 - AZURE_OPENAI_GPT4O_UNSAFE_CHAT_* - Azure OpenAI GPT-4o unsafe - AZURE_OPENAI_GPT4O_UNSAFE_CHAT_*2 - Azure OpenAI GPT-4o unsafe secondary - AZURE_FOUNDRY_DEEPSEEK_* - Azure AI Foundry DeepSeek - AZURE_FOUNDRY_PHI4_* - Azure AI Foundry Phi-4 - AZURE_FOUNDRY_MISTRAL_LARGE_* - Azure AI Foundry Mistral Large - GROQ_* - Groq API - OPEN_ROUTER_* - OpenRouter API - OLLAMA_* - Ollama local - GOOGLE_GEMINI_* - Google Gemini (OpenAI-compatible) **OpenAI Responses Targets (OpenAIResponseTarget):** - AZURE_OPENAI_GPT5_RESPONSES_* - Azure OpenAI GPT-5 Responses - PLATFORM_OPENAI_RESPONSES_* - Platform OpenAI Responses - AZURE_OPENAI_RESPONSES_* - Azure OpenAI Responses **Realtime Targets (RealtimeTarget):** - PLATFORM_OPENAI_REALTIME_* - Platform OpenAI Realtime - AZURE_OPENAI_REALTIME_* - Azure OpenAI Realtime **Image Targets (OpenAIImageTarget):** - OPENAI_IMAGE_*1 - Azure OpenAI Image - OPENAI_IMAGE_*2 - Platform OpenAI Image **TTS Targets (OpenAITTSTarget):** - OPENAI_TTS_*1 - Azure OpenAI TTS - OPENAI_TTS_*2 - Platform OpenAI TTS **Video Targets (OpenAIVideoTarget):** - AZURE_OPENAI_VIDEO_* - Azure OpenAI Video **Completion Targets (OpenAICompletionTarget):** - OPENAI_COMPLETION_* - OpenAI Completion **Azure ML Targets (AzureMLChatTarget):** - AZURE_ML_PHI_* - Azure ML Phi **Safety Targets (PromptShieldTarget):** - AZURE_CONTENT_SAFETY_* - Azure Content Safety Example: initializer = AIRTTargetInitializer() await initializer.initialize_async() """
[docs] def __init__(self) -> None: """Initialize the AIRT Target Initializer.""" super().__init__()
@property def name(self) -> str: """Get the name of this initializer.""" return "AIRT Target Initializer" @property def description(self) -> str: """Get the description of this initializer.""" return ( "Instantiates a collection of (AI Red Team suggested) targets from " "available environment variables and adds them to the TargetRegistry" ) @property def required_env_vars(self) -> List[str]: """ Get list of required environment variables. Returns empty list since this initializer is optional - it registers whatever endpoints are available without requiring any. """ return []
[docs] async def initialize_async(self) -> None: """ Register available targets based on environment variables. Scans for known endpoint environment variables and registers the corresponding targets into the TargetRegistry. """ for config in TARGET_CONFIGS: self._register_target(config)
def _register_target(self, config: TargetConfig) -> None: """ Register a target if its required environment variables are set. Args: config: The target configuration specifying env vars and target class. """ endpoint = os.getenv(config.endpoint_var) if not endpoint: return # If key_var is empty, use placeholder (for targets like Ollama that don't require auth) # If key_var is set, look up the env var and skip registration if not found if config.key_var: api_key = os.getenv(config.key_var) if not api_key: return else: api_key = "not-needed" model_name = os.getenv(config.model_var) if config.model_var else None underlying_model = os.getenv(config.underlying_model_var) if config.underlying_model_var else None # Build kwargs for the target constructor kwargs: dict[str, Any] = { "endpoint": endpoint, "api_key": api_key, } # Only add model_name if the target supports it (PromptShieldTarget doesn't) if model_name is not None: kwargs["model_name"] = model_name # Add underlying_model if specified (for Azure deployments where name differs from model) if underlying_model is not None: kwargs["underlying_model"] = underlying_model target = config.target_class(**kwargs) registry = TargetRegistry.get_registry_singleton() registry.register_instance(target, name=config.registry_name) logger.info(f"Registered target: {config.registry_name}")