Skip to content

Commit be65f8a

Browse files
committed
update: rename Translator -> LangProvider and associated elements (NVIDIA#1183)
2 parents 86dd155 + 227cd36 commit be65f8a

33 files changed

+417
-444
lines changed

garak/_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def _nested_dict():
116116
run.seed = None
117117
run.soft_probe_prompt_cap = 64
118118
run.target_lang = "en"
119-
run.translators = []
119+
run.langproviders = []
120120

121121
# placeholder
122122
# generator, probe, detector, buff = {}, {}, {}, {}

garak/attempt.py

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ class Attempt:
4040
:type messages: List(dict)
4141
:param lang: Language code for prompt as sent to the target
4242
:type lang: str, valid BCP47
43-
:param reverse_translator_outputs: The reverse translation of output based on the original language of the probe
44-
:param reverse_translator_outputs: List(str)
43+
:param reverse_translation_outputs: The reverse translation of output based on the original language of the probe
44+
:param reverse_translation_outputs: List(str)
4545
4646
Expected use
4747
* an attempt tracks a seed prompt and responses to it
@@ -77,7 +77,7 @@ def __init__(
7777
goal=None,
7878
seq=-1,
7979
lang=None, # language code for prompt as sent to the target
80-
reverse_translator_outputs=None,
80+
reverse_translation_outputs=None,
8181
) -> None:
8282
self.uuid = uuid.uuid4()
8383
self.messages = []
@@ -93,8 +93,8 @@ def __init__(
9393
if prompt is not None:
9494
self.prompt = prompt
9595
self.lang = lang
96-
self.reverse_translator_outputs = (
97-
{} if reverse_translator_outputs is None else reverse_translator_outputs
96+
self.reverse_translation_outputs = (
97+
{} if reverse_translation_outputs is None else reverse_translation_outputs
9898
)
9999

100100
def as_dict(self) -> dict:
@@ -114,7 +114,7 @@ def as_dict(self) -> dict:
114114
"goal": self.goal,
115115
"messages": self.messages,
116116
"lang": self.lang,
117-
"reverse_translator_outputs": list(self.reverse_translator_outputs),
117+
"reverse_translation_outputs": list(self.reverse_translation_outputs),
118118
}
119119

120120
@property
@@ -206,12 +206,7 @@ def prompt_for(self, lang) -> str:
206206
207207
When "*" or None are passed returns the prompt passed to the model
208208
"""
209-
if (
210-
lang is not None
211-
and self.lang != "*"
212-
and lang != "*"
213-
and self.lang != lang
214-
):
209+
if lang is not None and self.lang != "*" and lang != "*" and self.lang != lang:
215210
return self.notes.get(
216211
"pre_translation_prompt", self.prompt
217212
) # update if found in notes
@@ -223,13 +218,8 @@ def outputs_for(self, lang) -> List[str]:
223218
224219
When "*" or None are passed returns the original model output
225220
"""
226-
if (
227-
lang is not None
228-
and self.lang != "*"
229-
and lang != "*"
230-
and self.lang != lang
231-
):
232-
return self.reverse_translator_outputs
221+
if lang is not None and self.lang != "*" and lang != "*" and self.lang != lang:
222+
return self.reverse_translation_outputs
233223
return self.all_outputs
234224

235225
def _expand_prompt_to_histories(self, breadth):

garak/buffs/low_resource_languages.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,23 @@ def __init__(self, config_root=_config):
3535
def transform(
3636
self, attempt: garak.attempt.Attempt
3737
) -> Iterable[garak.attempt.Attempt]:
38-
translator = Translator(self.api_key)
38+
deepl_translator = Translator(self.api_key)
3939
prompt = attempt.prompt
4040
attempt.notes["original_prompt"] = prompt
4141
for language in LOW_RESOURCE_LANGUAGES:
4242
attempt.notes["LRL_buff_dest_lang"] = language
43-
response = translator.translate_text(prompt, target_lang=language)
43+
response = deepl_translator.translate_text(prompt, target_lang=language)
4444
translated_prompt = response.text
4545
attempt.prompt = translated_prompt
4646
yield self._derive_new_attempt(attempt)
4747

4848
def untransform(self, attempt: garak.attempt.Attempt) -> garak.attempt.Attempt:
49-
translator = Translator(self.api_key)
49+
deepl_translator = Translator(self.api_key)
5050
outputs = attempt.outputs
5151
attempt.notes["original_responses"] = outputs
5252
translated_outputs = list()
5353
for output in outputs:
54-
response = translator.translate_text(output, target_lang="EN-US")
54+
response = deepl_translator.translate_text(output, target_lang="EN-US")
5555
translated_output = response.text
5656
translated_outputs.append(translated_output)
5757
attempt.outputs = translated_outputs

garak/harnesses/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ def _initialize_runtime_services():
2828
"""Initialize and validate runtime services required for a successful test"""
2929

3030
from garak.exception import GarakException
31-
from garak.langservice import load_translators
31+
import garak.langservice
3232

3333
# TODO: this block may be gated in the future to ensure it is only run once. At this time
3434
# only one harness will execute per run so the output here is reasonable.
3535
try:
3636
msg = "🌐 Loading Language services if required."
3737
logging.info(msg)
3838
print(msg)
39-
load_translators()
39+
garak.langservice.load()
4040
except GarakException as e:
4141
logging.critical("❌ Language setup failed! ❌", exc_info=e)
4242
raise e

garak/translators/base.py renamed to garak/langproviders/base.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def is_meaning_string(text: str) -> bool:
126126

127127

128128
# To be `Configurable` the root object must meet the standard type search criteria
129-
# { translators:
129+
# { langproviders:
130130
# "local": { # model_type
131131
# "language": "<from>-<to>"
132132
# "name": "model/name" # model_name
@@ -136,8 +136,8 @@ def is_meaning_string(text: str) -> bool:
136136
from garak.configurable import Configurable
137137

138138

139-
class Translator(Configurable):
140-
"""Base class for objects that execute translation"""
139+
class LangProvider(Configurable):
140+
"""Base class for objects that provision language"""
141141

142142
def __init__(self, config_root: dict = {}) -> None:
143143
self._load_config(config_root=config_root)
@@ -146,9 +146,9 @@ def __init__(self, config_root: dict = {}) -> None:
146146

147147
self._validate_env_var()
148148

149-
self._load_translator()
149+
self._load_langprovider()
150150

151-
def _load_translator(self):
151+
def _load_langprovider(self):
152152
raise NotImplementedError
153153

154154
def _translate(self, text: str) -> str:
@@ -218,7 +218,7 @@ def _should_skip_line(self, line: str) -> bool:
218218
def _clean_line(self, line: str) -> str:
219219
return remove_english_punctuation(line.strip().lower().split())
220220

221-
def translate(
221+
def get_text(
222222
self,
223223
prompts: List[str],
224224
reverse_translate_judge: bool = False,

garak/translators/local.py renamed to garak/langproviders/local.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,34 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44

5-
"""Translator that translates a prompt."""
5+
"""Local language providers & translators."""
66

77

88
from typing import List
99

1010
from garak.exception import BadGeneratorException
11-
from garak.translators.base import Translator
11+
from garak.langproviders.base import LangProvider
1212
from garak.resources.api.huggingface import HFCompatible
1313

1414

15-
class NullTranslator(Translator):
16-
"""Stand-in translator for pass through"""
15+
class Passthru(LangProvider):
16+
"""Stand-in language provision for pass through / noop"""
1717

18-
def _load_translator(self):
18+
def _load_langprovider(self):
1919
pass
2020

2121
def _translate(self, text: str) -> str:
2222
return text
2323

24-
def translate(
24+
def get_text(
2525
self,
2626
prompts: List[str],
2727
reverse_translate_judge: bool = False,
2828
) -> List[str]:
2929
return prompts
3030

3131

32-
class LocalHFTranslator(Translator, HFCompatible):
32+
class LocalHFTranslator(LangProvider, HFCompatible):
3333
"""Local translation using Huggingface m2m100 or Helsinki-NLP/opus-mt-* models
3434
3535
Reference:
@@ -56,7 +56,7 @@ def __init__(self, config_root: dict = {}) -> None:
5656
self.device = self._select_hf_device()
5757
super().__init__(config_root=config_root)
5858

59-
def _load_translator(self):
59+
def _load_langprovider(self):
6060
if "m2m100" in self.model_name:
6161
from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
6262

@@ -89,7 +89,7 @@ def _load_translator(self):
8989
self.source_lang in lang_support and self.target_lang in lang_support
9090
):
9191
raise BadGeneratorException(
92-
f"Language pair {self.language} is not supported for this translator service."
92+
f"Language pair {self.language} is not supported for this translation service."
9393
)
9494

9595
self.model = M2M100ForConditionalGeneration.from_pretrained(

garak/translators/remote.py renamed to garak/langproviders/remote.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
import logging
99

1010
from garak.exception import BadGeneratorException
11-
from garak.translators.base import Translator
11+
from garak.langproviders.base import LangProvider
1212

1313
VALIDATION_STRING = "A" # just send a single ASCII character for a sanity check
1414

1515

16-
class RivaTranslator(Translator):
16+
class RivaTranslator(LangProvider):
1717
"""Remote translation using NVIDIA Riva translation API
1818
1919
https://developer.nvidia.com/riva
@@ -47,18 +47,18 @@ class RivaTranslator(Translator):
4747

4848
# avoid attempt to pickle the client attribute
4949
def __getstate__(self) -> object:
50-
self._clear_translator()
50+
self._clear_langprovider()
5151
return dict(self.__dict__)
5252

5353
# restore the client attribute
5454
def __setstate__(self, d) -> object:
5555
self.__dict__.update(d)
56-
self._load_translator()
56+
self._load_langprovider()
5757

58-
def _clear_translator(self):
58+
def _clear_langprovider(self):
5959
self.client = None
6060

61-
def _load_translator(self):
61+
def _load_langprovider(self):
6262
if not (
6363
self.source_lang in self.lang_support
6464
and self.target_lang in self.lang_support
@@ -91,7 +91,7 @@ def _load_translator(self):
9191
def _translate(self, text: str) -> str:
9292
try:
9393
if self.client is None:
94-
self._load_translator()
94+
self._load_langprovider()
9595
response = self.client.translate(
9696
[text], "", self._source_lang, self._target_lang
9797
)
@@ -101,7 +101,7 @@ def _translate(self, text: str) -> str:
101101
return text
102102

103103

104-
class DeeplTranslator(Translator):
104+
class DeeplTranslator(LangProvider):
105105
"""Remote translation using DeepL translation API
106106
107107
https://www.deepl.com/en/translator
@@ -127,7 +127,7 @@ class DeeplTranslator(Translator):
127127
"en": "en-US",
128128
}
129129

130-
def _load_translator(self):
130+
def _load_langprovider(self):
131131
from deepl import Translator
132132

133133
if not (

0 commit comments

Comments
 (0)