The Foundry scenario family provides the RedTeamAgent — a comprehensive red teaming scenario
that combines converter-based attacks (encoding/obfuscation), multi-turn attacks (Crescendo,
RedTeaming), and technique composition. It’s organized into difficulty levels: EASY, MODERATE,
and DIFFICULT.
For full programming details, see Common Scenario Parameters.
from pathlib import Path
from pyrit.output import output_scenario_async
from pyrit.registry import TargetRegistry
from pyrit.scenario import DatasetAttackConfiguration
from pyrit.scenario.foundry import FoundryTechnique, RedTeamAgent
from pyrit.setup import initialize_from_config_async
await initialize_from_config_async(config_path=Path("pyrit_conf.yaml")) # type: ignore
objective_target = TargetRegistry.get_registry_singleton().instances.get("openai_chat")Found default environment files: ['./.pyrit/.env', './.pyrit/.env.local']
Loaded environment file: ./.pyrit/.env
Loaded environment file: ./.pyrit/.env.local
[pyrit:alembic] No new upgrade operations detected.
TextAdaptive: _EXCLUDED_TECHNIQUES entries ['prompt_sending'] are not in the current scenario-techniques catalog ['context_compliance', 'crescendo_history_lecture', 'crescendo_journalist_interview', 'crescendo_movie_director', 'crescendo_simulated', 'many_shot', 'pair', 'red_teaming', 'role_play', 'tap', 'violent_durian']; the exclusion is a no-op for those entries. Remove stale entries or update the catalog.
RedTeamAgent¶
Tests a target using a wide range of attack techniques — from simple encoding converters to complex multi-turn conversations. The default dataset is HarmBench.
CLI example:
pyrit_scan foundry.red_team_agent --target openai_chat --techniques base64 --max-dataset-size 1Available techniques by difficulty:
| Difficulty | Techniques |
|---|---|
| EASY | AnsiAttack, AsciiArt, AsciiSmuggler, Atbash, Base64, Binary, Caesar, CharacterSpace, CharSwap, Diacritic, Flip, Jailbreak, Leetspeak, Morse, ROT13, StringJoin, SuffixAppend, UnicodeConfusable, UnicodeSubstitution, Url |
| MODERATE | Tense |
| DIFFICULT | Crescendo, MultiTurn, Pair, Tap |
| Aggregates | ALL, EASY, MODERATE, DIFFICULT |
dataset_config = DatasetAttackConfiguration(dataset_names=["harmbench"], max_dataset_size=1)
scenario = RedTeamAgent()
scenario.set_params_from_args( # type: ignore
args={
"objective_target": objective_target,
"scenario_techniques": [FoundryTechnique.Base64],
"dataset_config": dataset_config,
}
)
await scenario.initialize_async() # type: ignore
print(f"Scenario: {scenario.name}")
print(f"Atomic attacks: {scenario.atomic_attack_count}")
scenario_result = await scenario.run_async() # type: ignoreScenario: RedTeamAgent
Atomic attacks: 2
await output_scenario_async(scenario_result)
====================================================================================================
📊 SCENARIO RESULTS: RedTeamAgent
====================================================================================================
▼ Scenario Information
────────────────────────────────────────────────────────────────────────────────────────────────────
📋 Scenario Details
• Name: RedTeamAgent
• Scenario Version: 1
• PyRIT Version: 0.15.0.dev0
• Description:
RedTeamAgent is a preconfigured scenario that automatically generates multiple AtomicAttack instances based on
the specified attack techniques. It supports both single-turn attacks (with various converters) and multi-turn
attacks (Crescendo, RedTeaming), making it easy to quickly test a target against multiple attack vectors. The
scenario can expand difficulty levels (EASY, MODERATE, DIFFICULT) into their constituent attack techniques, or
you can specify individual techniques directly. This scenario is designed for use with the Foundry AI Red
Teaming Agent library, providing a consistent PyRIT contract for their integration.
🎯 Target Information
• Target Type: OpenAIChatTarget
• Target Model: gpt-4o-japan-nilfilter
• Target Endpoint: https://pyrit-japan-test.openai.azure.com/openai/v1
📊 Scorer Information
▸ Scorer Identifier
• Scorer Type: FloatScaleThresholdScorer
• scorer_type: true_false
• score_aggregator: OR_
└─ Composite of 1 scorer(s):
• Scorer Type: AzureContentFilterScorer
• scorer_type: float_scale
▸ Performance Metrics
• Accuracy: 59.24%
• Accuracy Std Error: ±0.0247
• F1 Score: 0.5306
• Precision: 0.5987
• Recall: 0.4764
• Average Score Time: 0.04s
▼ Overall Statistics
────────────────────────────────────────────────────────────────────────────────────────────────────
📈 Summary
• Total Techniques: 2
• Total Attack Results: 2
• Overall Success Rate: 0%
• Unique Objectives: 1
▼ Per-Group Breakdown
────────────────────────────────────────────────────────────────────────────────────────────────────
🔸 Group: baseline
• Number of Results: 1
• Success Rate: 0%
🔸 Group: base64
• Number of Results: 1
• Success Rate: 0%
====================================================================================================
Technique Composition¶
You can pair a multi-turn attack with one or more converter techniques using FoundryComposite.
Each converter in the composite is applied in sequence before the attack runs.
from pyrit.scenario.foundry import FoundryComposite
composed = FoundryComposite(attack=FoundryTechnique.Crescendo, converters=[FoundryTechnique.Caesar, FoundryTechnique.CharSwap])# from pyrit.scenario.foundry import FoundryComposite
# composed = FoundryComposite(attack=FoundryTechnique.Crescendo, converters=[FoundryTechnique.Caesar, FoundryTechnique.CharSwap])
# scenario_techniques = [FoundryTechnique.Base64, composed]For more details, see the Scenarios Programming Guide and Configuration.