Spaces:
Paused
Paused
| # """ | |
| # This module provides functions to generate dynamic hints and curiosities about a secret word using llms. | |
| # Functions: | |
| # hint(secret, n, model, last_hint, lang, Config): | |
| # Generates a dynamic hint based on the secret word and the number of hints given. | |
| # Parameters: | |
| # secret (str): The secret word. | |
| # n (int): The number of hints already given. | |
| # model: The sentence transformer model used for encoding. | |
| # last_hint (int): The index of the last hint given. | |
| # lang (int): The language code (0 for Spanish, 1 for English). | |
| # Config: Configuration object containing hint templates. | |
| # Returns: | |
| # tuple: A tuple containing the generated hint (str), the updated number of hints (int), and the index of the last hint given (int). | |
| # curiosity(secret, Config): | |
| # Generates a curiosity about the secret word. | |
| # Parameters: | |
| # secret (str): The secret word. | |
| # Config: Configuration object containing the curiosity template. | |
| # Returns: | |
| # str: The generated curiosity. | |
| # ireplace(old, new, text): | |
| # Replaces all occurrences of a substring in a string, case-insensitively. | |
| # Parameters: | |
| # old (str): The substring to be replaced. | |
| # new (str): The substring to replace with. | |
| # text (str): The original string. | |
| # Returns: | |
| # str: The modified string with all occurrences of the old substring replaced by the new substring. | |
| # """ | |
| import random | |
| import openai | |
| from sentence_transformers import util | |
| gpt_model = "gpt-3.5-turbo" | |
| # Dynamic hint function that returns a hint based on the secret word and the number of hints given | |
| def hint(secret, n, model, last_hint, lang, Config): | |
| # Initialize hint variable | |
| hint = "" | |
| # Advanced hints | |
| if n >= 3: | |
| j = random.randint(0, 2) | |
| while j == last_hint: | |
| j = random.randint(0, 2) | |
| # Advanced hint 1: Definition of the secret word | |
| if j == 0: | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.hint_0_0 # type: ignore | |
| + secret | |
| + Config.hint_0_1 # type: ignore | |
| + secret | |
| + Config.hint_0_2, # type: ignore | |
| } | |
| ], | |
| temperature=1, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0.5, | |
| presence_penalty=0, | |
| ) | |
| output = str(response.choices[0].message.content) | |
| output = output.replace('"', "").replace("'", "") | |
| # Replace the secret word with "La palabra secreta" or "The secret word" just in case the model uses the secret word in the definition | |
| if lang == 0: | |
| output = ireplace("la " + secret, "La palabra secreta", output) | |
| output = ireplace("las " + secret, "La palabra secreta", output) | |
| output = ireplace("el " + secret, "La palabra secreta", output) | |
| output = ireplace("los " + secret, "La palabra secreta", output) | |
| output = ireplace("un " + secret, "La palabra secreta", output) | |
| output = ireplace("una " + secret, "La palabra secreta", output) | |
| output = ireplace("unos " + secret, "La palabra secreta", output) | |
| output = ireplace("unas " + secret, "La palabra secreta", output) | |
| elif lang == 1: | |
| output = ireplace("the " + secret, "The secret word", output) | |
| output = ireplace("a " + secret, "The secret word", output) | |
| hint += Config.hint_0_3 + output # type: ignore | |
| last_hint = 0 | |
| # Advanced hint 2: Representation of the secret word with emojis | |
| elif j == 1: | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.hint_1_0 + secret + Config.hint_1_1, # type: ignore | |
| } | |
| ], | |
| temperature=1, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0, | |
| presence_penalty=0, | |
| ) | |
| output = str(response.choices[0].message.content) | |
| hint += Config.hint_1_2 + output # type: ignore | |
| last_hint = 1 | |
| # Advanced hint 3: Poem about the secret word | |
| elif j == 2: | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.hint_2_0 + secret + Config.hint_2_1, # type: ignore | |
| } | |
| ], | |
| temperature=1, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0, | |
| presence_penalty=0, | |
| ) | |
| output = str(response.choices[0].message.content) | |
| hint += Config.hint_2_2 + output # type: ignore | |
| last_hint = 2 | |
| # Initial hints | |
| else: | |
| j = random.randint(3, 4) | |
| while j == last_hint: | |
| j = random.randint(3, 4) | |
| # Initial hint 1: Rank of four words related to the secret word | |
| if j == 3: | |
| words = [] | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.hint_3_0, # type: ignore | |
| } | |
| ], | |
| temperature=1.25, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0, | |
| presence_penalty=0, | |
| ) | |
| output = str(response.choices[0].message.content) | |
| output = (output.replace(" ", "").replace(".", "")).lower() | |
| words.extend(output.strip().split(",")) | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.hint_3_1 # type: ignore | |
| + secret | |
| + Config.hint_3_2, # type: ignore | |
| } | |
| ], | |
| temperature=1.1, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0, | |
| presence_penalty=0, | |
| ) | |
| output = str(response.choices[0].message.content) | |
| output = (output.replace(".", "")).lower() | |
| words.append(output) # type: ignore | |
| random.shuffle(words) | |
| sentences1 = [secret, secret, secret, secret] | |
| sentences2 = words | |
| embeddings1 = model.encode(sentences1, convert_to_tensor=True) | |
| embeddings2 = model.encode(sentences2, convert_to_tensor=True) | |
| cosine_scores = util.cos_sim(embeddings1, embeddings2) | |
| scores = cosine_scores[0].tolist() | |
| sum_scores = sum(scores) | |
| normalized_scores = [round(score * 100 / sum_scores, 1) for score in scores] | |
| hint += Config.hint_3_3 # type: ignore | |
| max_len = -1 | |
| for ele in words: | |
| if len(ele) > max_len: | |
| max_len = len(ele) | |
| longest_word = ele | |
| for i in range(len(words)): | |
| word_hint = words[i].ljust(len(longest_word) + 1) | |
| hint += ( | |
| # word_hint[: len(longest_word)] | |
| word_hint | |
| + "|" | |
| + ("🟩") * round(normalized_scores[i] * 0.2) | |
| + " " | |
| + str(normalized_scores[i]) | |
| + "%\n" | |
| ) | |
| last_hint = 3 | |
| # Initial hint 2: Film representation with emojis with the secret word | |
| elif j == 4: | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.hint_4_0 # type: ignore | |
| + secret | |
| + Config.hint_4_1, # type: ignore | |
| } | |
| ], | |
| temperature=1, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0, | |
| presence_penalty=0, | |
| ) | |
| film_title = str(response.choices[0].message.content).replace('"', "") | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.hint_4_2 # type: ignore | |
| + film_title | |
| + Config.hint_4_3, # type: ignore | |
| } | |
| ], | |
| temperature=1, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0, | |
| presence_penalty=0, | |
| ) | |
| output = str(response.choices[0].message.content) | |
| hint += Config.hint_4_4 + "\n" + output # type: ignore | |
| last_hint = 4 | |
| return hint, n + 1, last_hint | |
| # Tell a curiosity about the secret word | |
| def curiosity(secret, Config): | |
| response = openai.chat.completions.create( | |
| model=gpt_model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": Config.curiosity + secret + '".', | |
| } | |
| ], | |
| temperature=1, | |
| max_tokens=256, | |
| top_p=1, | |
| frequency_penalty=0, | |
| presence_penalty=0, | |
| ) | |
| output = str(response.choices[0].message.content) | |
| return output | |
| # Replace all occurrences of a substring in a string | |
| def ireplace(old, new, text): | |
| idx = 0 | |
| while idx < len(text): | |
| index_l = text.lower().find(old.lower(), idx) | |
| if index_l == -1: | |
| return text | |
| text = text[:index_l] + new + text[index_l + len(old) :] | |
| idx = index_l + len(new) | |
| return text | |