Skip to content
Merged
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
7 changes: 4 additions & 3 deletions pyrit/converter/random_translation_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,10 @@ def __init__(
default_languages = SeedDataset.from_yaml_file(
RandomTranslationConverter._DEFAULT_LANGUAGES_SEED_PROMPT_PATH
)
self.languages = [prompt.value for prompt in default_languages.prompts]
else:
self.languages = languages
languages = [prompt.value for prompt in default_languages.prompts]
# Seeded selection picks by position, so the pool uses the same order as the identifier.
# Otherwise two pools that differ only in order share an identity but choose different languages.
self.languages = sorted(languages, key=str.casefold)

def _build_identifier(self) -> ComponentIdentifier:
"""
Expand Down
19 changes: 19 additions & 0 deletions tests/unit/converter/test_random_translation_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import pytest
from unit.mocks import get_mock_target_identifier

from pyrit.common.random_context import configure_random_seed
from pyrit.converter import (
RandomTranslationConverter,
WordPositionSelectionStrategy,
Expand Down Expand Up @@ -81,6 +82,24 @@ def test_random_translation_converter_identifier_canonicalizes_language_order(mo
assert first.get_identifier().hash == reordered.get_identifier().hash


async def test_random_translation_converter_language_order_does_not_change_seeded_choices(mock_target) -> None:
first = RandomTranslationConverter(converter_target=mock_target, languages=["Spanish", "French", "German"])
reordered = RandomTranslationConverter(converter_target=mock_target, languages=["German", "Spanish", "French"])

try:
configure_random_seed(seed=7)
await first.convert_async(prompt="one two three four five six")
await reordered.convert_async(prompt="one two three four five six")
finally:
configure_random_seed(seed=None)

first_request, reordered_request = (
call.kwargs["message"].get_value() for call in mock_target.send_prompt_async.call_args_list
)
assert first.get_identifier().hash == reordered.get_identifier().hash
assert first_request == reordered_request


def test_random_translation_converter_identifier_distinguishes_language_pools(mock_target) -> None:
first = RandomTranslationConverter(converter_target=mock_target, languages=["French", "Spanish"])
different = RandomTranslationConverter(converter_target=mock_target, languages=["German", "Japanese"])
Expand Down
Loading