@@ -103,6 +103,7 @@ class ConfigurationLoader(YamlLoadable):
103103 None means "use defaults", [] means "load nothing".
104104 env_files: List of environment file paths to load.
105105 None means "use defaults (.env, .env.local)", [] means "load nothing".
106+ datasets: List of seed dataset names to load into memory after initialization.
106107 silent: Whether to suppress initialization messages.
107108 operator: Name for the current operator, e.g. a team or username.
108109 operation: Name for the current operation.
@@ -123,6 +124,10 @@ class ConfigurationLoader(YamlLoadable):
123124 - /path/to/.env
124125 - /path/to/.env.local
125126
127+ datasets:
128+ - airt_illegal
129+ - airt_malware
130+
126131 silent: false
127132
128133 operator: my_team
@@ -141,6 +146,7 @@ class ConfigurationLoader(YamlLoadable):
141146 initialization_scripts : list [str ] | None = None
142147 env_files : list [str ] | None = None
143148 env_akv_ref : list [str ] | None = None
149+ datasets : list [str ] = field (default_factory = list )
144150 silent : bool = False
145151 operator : str | None = None
146152 operation : str | None = None
@@ -379,6 +385,7 @@ def load_with_overrides(
379385 config_data ["initialization_scripts" ] = default_config .initialization_scripts
380386 config_data ["env_files" ] = default_config .env_files
381387 config_data ["env_akv_ref" ] = default_config .env_akv_ref
388+ config_data ["datasets" ] = default_config .datasets
382389 config_data ["silent" ] = default_config .silent
383390 if default_config .operator :
384391 config_data ["operator" ] = default_config .operator
@@ -405,6 +412,7 @@ def load_with_overrides(
405412 config_data ["initialization_scripts" ] = explicit_config .initialization_scripts
406413 config_data ["env_files" ] = explicit_config .env_files
407414 config_data ["env_akv_ref" ] = explicit_config .env_akv_ref
415+ config_data ["datasets" ] = explicit_config .datasets
408416 config_data ["silent" ] = explicit_config .silent
409417 if explicit_config .operator :
410418 config_data ["operator" ] = explicit_config .operator
@@ -560,7 +568,8 @@ async def initialize_pyrit_async(self) -> None:
560568 Initialize PyRIT with the loaded configuration.
561569
562570 This method resolves all initializer names to instances and calls
563- the core initialize_pyrit_async function.
571+ the core initialize_pyrit_async function. Any datasets configured via
572+ the ``datasets`` block are loaded into memory after initialization.
564573
565574 Raises:
566575 ValueError: If configuration is invalid or initializers cannot be resolved.
@@ -581,6 +590,37 @@ async def initialize_pyrit_async(self) -> None:
581590 silent = self .silent ,
582591 )
583592
593+ await self ._load_datasets_async ()
594+
595+ async def _load_datasets_async (self ) -> None :
596+ """
597+ Load the configured seed datasets into memory.
598+
599+ Fetches each dataset named in the ``datasets`` block and adds its seeds
600+ to ``CentralMemory``. This runs after PyRIT initialization so that memory
601+ is available. No-op when no datasets are configured.
602+
603+ Raises:
604+ ValueError: If any configured dataset name does not exist.
605+ """
606+ if not self .datasets :
607+ return
608+
609+ import logging
610+
611+ from pyrit .datasets import SeedDatasetProvider
612+ from pyrit .memory import CentralMemory
613+
614+ logger = logging .getLogger (__name__ )
615+ logger .info ("Loading %d dataset(s) from configuration..." , len (self .datasets ))
616+
617+ datasets = await SeedDatasetProvider .fetch_datasets_async (dataset_names = self .datasets )
618+
619+ memory = CentralMemory .get_memory_instance ()
620+ await memory .add_seed_datasets_to_memory_async (datasets = datasets , added_by = "ConfigurationLoader" )
621+
622+ logger .info ("Successfully loaded %d dataset(s) into memory" , len (datasets ))
623+
584624
585625async def initialize_from_config_async (
586626 config_path : str | pathlib .Path | None = None ,
0 commit comments