def getGenerator(): colPrint( "\nInitializing AI Engine! (This might take a few minutes)\n", colors["loading-message"], ) models = [x for x in Path('models').iterdir() if x.is_dir()] if not models: raise FileNotFoundError( 'There are no models in the models directory! You must download a pytorch compatible model!' ) elif len(models) > 1: colPrint( "You have multiple models in your models folder. Please select one to load:", colors['message']) for n, model_path in enumerate(models): colPrint("{}: {}".format(n, model_path.name), colors['menu']) model = models[getNumberInput(len(models) - 1)] else: model = models[0] logger.info("Using model: " + str(model)) return GPT2Generator( model_path=model, generate_num=settings.getint("generate-num"), temperature=settings.getfloat("temp"), top_k=settings.getint("top-keks"), top_p=settings.getfloat("top-p"), repetition_penalty=settings.getfloat("rep-pen"), )
def instructions(): if settings.getboolean("console-bell"): bell = "on" else: bell = "off" if settings.getboolean("action-d20"): d20 = "on" else: d20 = "off" print( '\033[' + colors["instructions"] + 'm' + 'AID2: Clover Edition Instructions: \n Enter actions starting with a verb ex. "go to the tavern" or "attack the orc."\n To speak enter say "(thing you want to say)" or just "(thing you want to say)"' ) print('The following commands can be entered for any action:') print( ' "/revert" Reverts the last action allowing you to pick a different action.' ) print(' "/quit" Quits the game and saves') print( ' "/menu" Starts a new game and saves your current one') print(' "/retry" Retries the last action') print(' "/restart" Restarts the current story') print( ' "/print" Prints a transcript of your adventure (without extra newline formatting)' ) print(' "/help" Prints these instructions again') print( ' "/set SETTING VALUE" Sets the specified setting to the specified value.:' ) print( ' temp Higher values make the AI more random. Default: 0.4 | Current:', settings.getfloat("temp")) print( ' rep-pen Controls how repetitive the AI is allowed to be. Default: 1.2 | Current:', settings.getfloat("rep-pen")) print( ' text-wrap-width Maximum width of lines printed by computer. Default: 80 | Current:', settings.getint("text-wrap-width")) print( ' console-bell Beep after AI generates text? Default: on | Current:', bell) print( ' top-keks Number of words the AI can randomly choose. Default: 20 | Current:', settings.getint("top-keks")) print(' generate-num Default: 60 | Current:', settings.getint("generate-num")) print(' top-p Default: 0.9 | Current:', settings.getfloat("top-p")) print(' log-level Default: 3 | Current:', settings.getint("log-level")) print( ' action-sugg How many actions to generate, 0 is off. Default: 4 | Current:', settings.getint("action-sugg")) print( ' action-d20 Make actions difficult. Default: on | Current:', d20) print( ' action-temp How random the suggested actions are. Default: 1 | Current:', settings.getfloat("action-temp"), '\033[39m')
def get_suggestion(self): return re.sub('\n.*', '', self.generator.generate_raw( self.get_story() + "\n\n> You", self.context, temperature=settings.getfloat('action-temp'), top_p=settings.getfloat('top-p'), top_k=settings.getint('top-keks'), repetition_penalty=1))
def getSuggestion(self): #temporary fix (TODO) return re.sub( '\n.*', '', self.generator.generate_raw( self.getStory() + "\n\n> You", self.prompt, temperature=settings.getfloat('action-temp'), top_p=settings.getfloat('top-p'), top_k=settings.getint('top-keks'), repetition_penalty=1))
def to_dict(self): res = {} res["temp"] = settings.getfloat('temp') res["top-p"] = settings.getfloat("top-p") res["top-keks"] = settings.getint("top-keks") res["rep-pen"] = settings.getfloat("rep-pen") res["context"] = self.context res["memory"] = self.memory res["actions"] = self.actions res["results"] = self.results return res
def act(self, action): assert (self.context.strip() + action.strip()) assert (settings.getint('top-keks') is not None) self.actions.append(format_result(action)) result = self.generator.generate( self.get_story() + action, self.context + ' '.join(self.memory), temperature=settings.getfloat('temp'), top_p=settings.getfloat('top-p'), top_k=settings.getint('top-keks'), repetition_penalty=settings.getfloat('rep-pen')) self.results.append(format_result(result)) return self.results[-1]
def act(self, action): assert (self.prompt + action) results = [] for i in range(self.numResults): assert (settings.getint('top-keks') is not None) results.append( self.generator.generate( self.getStory() + action, self.prompt, temperature=settings.getfloat('temp'), top_p=settings.getfloat('top-p'), top_k=settings.getint('top-keks'), repetition_penalty=settings.getfloat('rep-pen'))) #self.longTermMemory.join('\n\n'), self.prompt)) self.story.append([action, results]) return results
def get_action(self): # While we want the story to be on track, but not to on track that it loops # the actions can be quite random, and this helps inject some user curated randomness # and prevent loops. So lets make the actions quite random, and prevent duplicates while we are at it # what to feed to model? mem_ind = random.randint(1, 6) # How many steps to include sample = random.randint(0, 1) # Random steps from history? include_prompt = random.randint(0, 1) # Include the initial promts predicates = ['You try to ', 'You say "', 'You start to ', '"'] # The model has to continue from here predicate = random.sample(predicates, 1)[0] action_prompt = self.story_manager.story_context( mem_ind, sample, include_prompt) action_prompt[-1] = action_prompt[-1].strip() + "\n> " + predicate result_raw = self.story_manager.generator.generate_raw( action_prompt, generate_num=settings.getint("action-generate-num"), temperature=settings.getfloat("action-temp"), stop_tokens=self.story_manager.generator.tokenizer.encode( ["<|endoftext|>", "\n", ">"]) # stop_tokens=self.generator.tokenizer.encode(['>', '<|endoftext|>']) ) logger.info( "get_action (mem_ind=%s, sample=%s, include_prompt=%s, predicate=`%r`) -> %r", mem_ind, sample, include_prompt, predicate, result_raw) result = predicate + result_raw.lstrip() result = clean_suggested_action( result, min_length=settings.getint("action-min-length")) # Sometimes the suggestion start with "You" we will add that on later anyway so remove it here result = re.sub("^ ?[Yy]ou try to ?", "You ", result) result = re.sub("^ ?[Yy]ou start to ?", "You ", result) result = re.sub("^ ?[Yy]ou say \"", "\"", result) result = re.sub("^ ?[Yy]ou ?", "", result) return result