DrGabrielLopez's picture
resolved random issue
520c904
# 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)