diff --git a/README.md b/README.md index c2f3e80..d9a9523 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,21 @@ translation = ta.translate(source_lang, target_lang, source_text, country) ``` See examples/example_script.py for an example script to try out. +### Using OpenAI-compatible AI as backend: + +- Add `OPENAI_BASE_URL` to the environment variables or .env file to switch the API URL. +```bash +# export OPENAI_BASE_URL="https://api.openai.com/v1" +export OPENAI_BASE_URL="http://localhost:8080/v1 +``` + +- Select a model. +```python +import translation_agent as ta +source_lang, target_lang, country = "English", "Spanish", "Mexico" +translation = ta.translate(source_lang, target_lang, source_text, country, model = "llama-3-8b") +``` + ## License Translation Agent is released under the **MIT License**. You are free to use, modify, and distribute the code diff --git a/src/translation_agent/utils.py b/src/translation_agent/utils.py index 7a48969..9bc387e 100755 --- a/src/translation_agent/utils.py +++ b/src/translation_agent/utils.py @@ -70,7 +70,7 @@ def get_completion( def one_chunk_initial_translation( - source_lang: str, target_lang: str, source_text: str + source_lang: str, target_lang: str, source_text: str, model: str = "gpt-4-turbo", ) -> str: """ Translate the entire text as one chunk using an LLM. @@ -79,6 +79,8 @@ def one_chunk_initial_translation( source_lang (str): The source language of the text. target_lang (str): The target language for translation. source_text (str): The text to be translated. + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: str: The translated text. @@ -92,7 +94,7 @@ def one_chunk_initial_translation( {target_lang}:""" - translation = get_completion(translation_prompt, system_message=system_message) + translation = get_completion(translation_prompt, system_message=system_message, model=model) return translation @@ -103,6 +105,7 @@ def one_chunk_reflect_on_translation( source_text: str, translation_1: str, country: str = "", + model: str = "gpt-4-turbo", ) -> str: """ Use an LLM to reflect on the translation, treating the entire text as one chunk. @@ -113,6 +116,8 @@ def one_chunk_reflect_on_translation( source_text (str): The original text in the source language. translation_1 (str): The initial translation of the source text. country (str): Country specified for the target language. + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: str: The LLM's reflection on the translation, providing constructive criticism and suggestions for improvement. @@ -168,7 +173,7 @@ def one_chunk_reflect_on_translation( Each suggestion should address one specific part of the translation. Output only the suggestions and nothing else.""" - reflection = get_completion(reflection_prompt, system_message=system_message) + reflection = get_completion(reflection_prompt, system_message=system_message, model=model) return reflection @@ -178,6 +183,7 @@ def one_chunk_improve_translation( source_text: str, translation_1: str, reflection: str, + model: str = "gpt-4-turbo", ) -> str: """ Use the reflection to improve the translation, treating the entire text as one chunk. @@ -188,6 +194,8 @@ def one_chunk_improve_translation( source_text (str): The original text in the source language. translation_1 (str): The initial translation of the source text. reflection (str): Expert suggestions and constructive criticism for improving the translation. + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: str: The improved translation based on the expert suggestions. @@ -223,13 +231,13 @@ def one_chunk_improve_translation( Output only the new translation and nothing else.""" - translation_2 = get_completion(prompt, system_message) + translation_2 = get_completion(prompt, system_message, model=model) return translation_2 def one_chunk_translate_text( - source_lang: str, target_lang: str, source_text: str, country: str = "" + source_lang: str, target_lang: str, source_text: str, country: str = "", model: str = "gpt-4-turbo", ) -> str: """ Translate a single chunk of text from the source language to the target language. @@ -243,18 +251,20 @@ def one_chunk_translate_text( target_lang (str): The target language for the translation. source_text (str): The text to be translated. country (str): Country specified for the target language. + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: str: The improved translation of the source text. """ translation_1 = one_chunk_initial_translation( - source_lang, target_lang, source_text + source_lang, target_lang, source_text, model ) reflection = one_chunk_reflect_on_translation( - source_lang, target_lang, source_text, translation_1, country + source_lang, target_lang, source_text, translation_1, country, model ) translation_2 = one_chunk_improve_translation( - source_lang, target_lang, source_text, translation_1, reflection + source_lang, target_lang, source_text, translation_1, reflection, model ) return translation_2 @@ -286,7 +296,7 @@ def num_tokens_in_string( def multichunk_initial_translation( - source_lang: str, target_lang: str, source_text_chunks: List[str] + source_lang: str, target_lang: str, source_text_chunks: List[str], model: str = "gpt-4-turbo", ) -> List[str]: """ Translate a text in multiple chunks from the source language to the target language. @@ -295,6 +305,8 @@ def multichunk_initial_translation( source_lang (str): The source language of the text. target_lang (str): The target language for translation. source_text_chunks (List[str]): A list of text chunks to be translated. + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: List[str]: A list of translated text chunks. @@ -338,7 +350,7 @@ def multichunk_initial_translation( chunk_to_translate=source_text_chunks[i], ) - translation = get_completion(prompt, system_message=system_message) + translation = get_completion(prompt, system_message=system_message, model=model) translation_chunks.append(translation) return translation_chunks @@ -350,6 +362,7 @@ def multichunk_reflect_on_translation( source_text_chunks: List[str], translation_1_chunks: List[str], country: str = "", + model: str = "gpt-4-turbo", ) -> List[str]: """ Provides constructive criticism and suggestions for improving a partial translation. @@ -360,6 +373,8 @@ def multichunk_reflect_on_translation( source_text_chunks (List[str]): The source text divided into chunks. translation_1_chunks (List[str]): The translated chunks corresponding to the source text chunks. country (str): Country specified for the target language. + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: List[str]: A list of reflections containing suggestions for improving each translated chunk. @@ -459,7 +474,7 @@ def multichunk_reflect_on_translation( translation_1_chunk=translation_1_chunks[i], ) - reflection = get_completion(prompt, system_message=system_message) + reflection = get_completion(prompt, system_message=system_message, model=model) reflection_chunks.append(reflection) return reflection_chunks @@ -471,6 +486,7 @@ def multichunk_improve_translation( source_text_chunks: List[str], translation_1_chunks: List[str], reflection_chunks: List[str], + model: str = "gpt-4-turbo", ) -> List[str]: """ Improves the translation of a text from source language to target language by considering expert suggestions. @@ -481,6 +497,8 @@ def multichunk_improve_translation( source_text_chunks (List[str]): The source text divided into chunks. translation_1_chunks (List[str]): The initial translation of each chunk. reflection_chunks (List[str]): Expert suggestions for improving each translated chunk. + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: List[str]: The improved translation of each chunk. @@ -545,14 +563,14 @@ def multichunk_improve_translation( reflection_chunk=reflection_chunks[i], ) - translation_2 = get_completion(prompt, system_message=system_message) + translation_2 = get_completion(prompt, system_message=system_message, model=model) translation_2_chunks.append(translation_2) return translation_2_chunks def multichunk_translation( - source_lang, target_lang, source_text_chunks, country: str = "" + source_lang, target_lang, source_text_chunks, country: str = "", model: str = "gpt-4-turbo", ): """ Improves the translation of multiple text chunks based on the initial translation and reflection. @@ -564,12 +582,14 @@ def multichunk_translation( translation_1_chunks (List[str]): The list of initial translations for each source text chunk. reflection_chunks (List[str]): The list of reflections on the initial translations. country (str): Country specified for the target language + model (str, optional): The name of the OpenAI model to use for generating the completion. + Defaults to "gpt-4-turbo". Returns: List[str]: The list of improved translations for each source text chunk. """ translation_1_chunks = multichunk_initial_translation( - source_lang, target_lang, source_text_chunks + source_lang, target_lang, source_text_chunks, model ) reflection_chunks = multichunk_reflect_on_translation( @@ -578,6 +598,7 @@ def multichunk_translation( source_text_chunks, translation_1_chunks, country, + model, ) translation_2_chunks = multichunk_improve_translation( @@ -586,6 +607,7 @@ def multichunk_translation( source_text_chunks, translation_1_chunks, reflection_chunks, + model, ) return translation_2_chunks @@ -638,6 +660,7 @@ def translate( source_text, country, max_tokens=MAX_TOKENS_PER_CHUNK, + model="gpt-4-turbo", ): """Translate the source_text from source_lang to target_lang.""" @@ -649,7 +672,7 @@ def translate( ic("Translating text as a single chunk") final_translation = one_chunk_translate_text( - source_lang, target_lang, source_text, country + source_lang, target_lang, source_text, country, model ) return final_translation @@ -672,7 +695,7 @@ def translate( source_text_chunks = text_splitter.split_text(source_text) translation_2_chunks = multichunk_translation( - source_lang, target_lang, source_text_chunks, country + source_lang, target_lang, source_text_chunks, country, model ) return "".join(translation_2_chunks)