# imports import random import time from openai import OpenAI from dotenv import load_dotenv from middle_earth_adventure.constants import FIGHT_OPTIONS, PLAYER_FEELINGS, RIDDLE_OPTIONS, ROMANCE_OPTIONS from middle_earth_adventure.prompts import FINISH_PROMPT, SYSTEM_PROMPT, START_PROMPT, CONTINUE_PROMPT from middle_earth_adventure.utils import pick_rand_items from middle_earth_adventure.schemas import Player load_dotenv() class GameCore: def __init__(self, api_key:str, text_model:str, tts_model: str) -> None: self.client = OpenAI(api_key=api_key) self.text_model = text_model self.tts_model = tts_model self.message_history = [] # Start Adventure async def start_adventure(self, player: Player): if player is None: return None self.message_history = [] messages=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": START_PROMPT.format(name=player.name, sex=player.sex, type=player.type, skill1=player.skills[0], skill2=player.skills[1])} ] ai_response = self.client.chat.completions.create(messages=messages, model=self.text_model) ai_response = ai_response.choices[0].to_dict()["message"] self.message_history += messages self.message_history.append(ai_response) return ai_response['content'] # Continue Adventure async def continue_adventure(self, selection: str, player: Player): if player is None: return None variants, feeling = self.get_game_variations() print('variants=', str(variants)) message= {"role": "user", "content": CONTINUE_PROMPT.format(selection=selection, feeling=feeling, variants=variants)} ai_response = self.client.chat.completions.create(messages=[*self.message_history, message], model=self.text_model) ai_response = ai_response.choices[0].to_dict()["message"] self.message_history.append(message) self.message_history.append(ai_response) return ai_response['content'] async def finish_adventure(self, player, selection): if player is None: return None message= {"role": "user", "content": FINISH_PROMPT.format(selection=selection)} ai_response = self.client.chat.completions.create(messages=[*self.message_history, message], model=self.text_model, frequency_penalty=1.0, temperature=1.7, max_tokens=100, ) ai_response = ai_response.choices[0].to_dict()["message"] self.message_history.append(message) self.message_history.append(ai_response) return ai_response['content'] async def narrate_adventure_out_loud(self, text: str, narrator_voice: str): mp3_narration = self.client.audio.speech.create(model=self.tts_model, voice=narrator_voice, input=text) mp3_narration = mp3_narration.content # audio_base64 = base64.b64encode(mp3_narration).decode('utf-8') return mp3_narration async def generate_picture_of_the_adventure(self, prompt, model): if model == "dall-e-2": size = "512x512" if model == "dall-e-3": size = "1024x1024" image = self.client.images.generate(model=model, prompt=prompt, response_format='url', size=size, quality="standard", n=1) return (image.data[0].url) def get_game_variations(self): story_variants = ["(give me a {opt} fight)".format(opt=" and ".join(random.sample(FIGHT_OPTIONS, 2))), "(give me a {opt} riddle)".format(opt=" and ".join(random.sample(RIDDLE_OPTIONS, 2))), "(give me an {opt} character encounter)".format(opt=" and ".join(random.sample(ROMANCE_OPTIONS, 2))), "(add an epic building)"] feeling = random.choice(PLAYER_FEELINGS) return random.choice(story_variants), random.choice(feeling)