Skip to content

FEAT: Add single_turn_crescendo technique with adversarial_config#1665

Open
rlundeen2 wants to merge 6 commits intomicrosoft:mainfrom
rlundeen2:users/rlundeen/2026_04_27_single_turn_crescendo
Open

FEAT: Add single_turn_crescendo technique with adversarial_config#1665
rlundeen2 wants to merge 6 commits intomicrosoft:mainfrom
rlundeen2:users/rlundeen/2026_04_27_single_turn_crescendo

Conversation

@rlundeen2
Copy link
Copy Markdown
Contributor

@rlundeen2 rlundeen2 commented Apr 28, 2026

Adds single_turn_crescendo to the scenario technique catalog. It uses PromptSendingAttack with a SeedSimulatedConversation seed group to generate a multi-turn crescendo conversation via simulated_conversation,
then sends the final prompt as a single turn.

There are some updates to the technique spec to support this.

I ran, inspected the conversation, and it looks like a good crescendo :)

rlundeen2 and others added 3 commits April 28, 2026 10:21
…class factory field

- Make AttackAdversarialConfig a first-class field on AttackTechniqueFactory
  (not buried in _attack_kwargs). Injected into attack at create() time if
  the attack class accepts it; also exposed via adversarial_chat property for
  seed-technique execution.
- Add seed_technique field to AttackTechniqueSpec for techniques that need
  SeedAttackTechniqueGroup (e.g. simulated conversation).
- Extend build_scenario_techniques() to resolve adversarial config when
  spec.seed_technique.has_simulated_conversation is True.
- Add single_turn_crescendo entry to SCENARIO_TECHNIQUES using
  PromptSendingAttack + SeedSimulatedConversation.
- Create crescendo_simulated.yaml (RedTeamingAttack-compatible prompt that
  only uses objective/max_turns, avoiding StrictUndefined errors).
- Update and add tests for new behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@rlundeen2 rlundeen2 marked this pull request as ready for review April 28, 2026 21:30
"""
if "objective_target" in self._attack_kwargs:
raise ValueError("objective_target must not be in attack_kwargs — it is provided at create() time.")
if "attack_adversarial_config" in self._attack_kwargs:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this breaking? this class is pretty new so maybe not biggest deal but thought I'd flag.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

likely, but I don't think since the latest release. And no techniques use it yet so I wasn't too worried.

"kwargs": kwargs_for_id,
}
if self._adversarial_config is not None:
params["adversarial_config"] = self._serialize_value(self._adversarial_config)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does seed_technique belong in identifier too?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants