Spaces:
Runtime error
Runtime error
File size: 7,329 Bytes
f7cd020 7c7984f a135531 55b0da0 9ad6c07 e19f381 a659a92 b707618 b0e72b5 a135531 f7cd020 b0e72b5 a135531 b0e72b5 d484afa b0e72b5 55b0da0 a659a92 41f349c a659a92 9ad6c07 b707618 a659a92 b707618 a659a92 498d5e9 b707618 a135531 b707618 a659a92 a135531 b707618 a135531 b707618 a135531 a659a92 a135531 41f349c a135531 a659a92 d192eda a135531 f7cd020 d192eda f7cd020 9ad6c07 41f349c f7cd020 783f89a b0e72b5 41f349c a659a92 a135531 d192eda f7cd020 d192eda |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# formatted with python black, line length 200
import os, random
import openai
import gradio as gr
from game_content import INITIAL_WELCOME_TEXT
from game_content import GAME_INTRO_CHOICES, NOTES_TO_THE_NARRATOR_AT_START, AWAITING_INPUT, NOTES_TO_THE_NARRATOR_EVERY_TIME
from game_content import game_over_victory_txt, game_over_fail_txt, S_GAME_OVER
from game_content import N_TURNS_REQUIRED_TO_PASS_FIRST_BANDIT_ENCOUNTER, N_TURNS_REQUIRED_TO_REACH_HOME
import decider_utils
from decider_utils import YES, NO
from decider_questions import * # QUESTION_IS_USER_HOME, QUESTION_IS_USER_ENGAGED_WITH_BANDITS, etc.
from webpage import PAGE_STYLING_JS, PLEASE_BE_PATIENT_DIV, TOP_OF_SCREEN_PADDING_DIV
N_COMPLETIONS_WHEN_ELABORATING = 1 # I previously had this set to 3, but that made the program very slow.
MINIMUM_COMPLETION_LENGTH_CHARS_WHEN_ELABORATING = 7
def elaborate(
str_beginning,
prevent_user_from_reaching_home=True,
require_user_to_be_still_engaged_with_bandits=False,
):
longest_completion = ""
while len(longest_completion) < MINIMUM_COMPLETION_LENGTH_CHARS_WHEN_ELABORATING:
completions = openai.Completion.create(
engine="text-davinci-003",
prompt=str_beginning,
temperature=0.5,
max_tokens=4000 - int(len(str_beginning) / 4),
frequency_penalty=0.8,
presence_penalty=0.6,
n=N_COMPLETIONS_WHEN_ELABORATING,
)["choices"]
for i in range(0, N_COMPLETIONS_WHEN_ELABORATING):
completion = completions[i]["text"]
# debug_print(completion)
allowed = True
if prevent_user_from_reaching_home:
does_the_user_reach_home = decider_utils.yesno(QUESTION_IS_USER_HOME, str_beginning + completion, default=YES)
allowed = not does_the_user_reach_home
if require_user_to_be_still_engaged_with_bandits:
is_user_engaged_with_bandits = decider_utils.yesno(
QUESTION_IS_USER_ENGAGED_WITH_BANDITS,
str_beginning + completion,
default=YES,
)
allowed = allowed and is_user_engaged_with_bandits
if allowed and len(completion) > len(longest_completion):
longest_completion = completion
return str_beginning + longest_completion
def run_1_game_turn(s_narr_transcript, s_n_turns_elapsed, s_user_transcript, s_user_input):
n_turns_elapsed = int(s_n_turns_elapsed)
finally_add2_both_tscripts = ""
if n_turns_elapsed == 0 and s_narr_transcript == "":
# New game.
# I learned the hard way that we have to do the random choice thing from within the game code;
# because if we just put it inside the "with demo:" block,
# then the gradio server only runs the random choice once per reboot.
game_intro = random.choice(GAME_INTRO_CHOICES)
s_narr_transcript = game_intro + NOTES_TO_THE_NARRATOR_AT_START
s_user_transcript = game_intro
elif s_user_input == "":
s_user_transcript += "You must choose an action.\n"
elif S_GAME_OVER in s_narr_transcript:
s_user_transcript += "Sorry, the game is already over. To play again, please refresh the page.\n"
elif decider_utils.yesno(QUESTION_IS_ACTION_LIKELY_LETHAL, s_user_input, default=NO):
finally_add2_both_tscripts += game_over_fail_txt("You have taken an action that is likely to result in killing someone.")
elif decider_utils.yesno(QUESTION_IS_USER_ENGAGED_WITH_BANDITS, s_narr_transcript, default=NO) and decider_utils.yesno(QUESTION_IS_ACTION_RUNNING_AWAY, s_user_input, default=NO):
finally_add2_both_tscripts += "Invalid entry. You cannot outrun these bandits.\n"
elif decider_utils.yesno(QUESTION_IS_ACTION_MAGIC, s_user_input, default=NO):
finally_add2_both_tscripts += "Invalid entry. You are not a spellcaster and have no magic items except your revolver.\n"
else:
# User input accepted.
n_turns_elapsed += 1
s_user_transcript += s_user_input + "\n"
s_narr_transcript += s_user_input + "\n"
s_narr_transcript += NOTES_TO_THE_NARRATOR_EVERY_TIME
s_new_narr_transcript = elaborate(
s_narr_transcript,
prevent_user_from_reaching_home=n_turns_elapsed < N_TURNS_REQUIRED_TO_REACH_HOME,
require_user_to_be_still_engaged_with_bandits=n_turns_elapsed < N_TURNS_REQUIRED_TO_PASS_FIRST_BANDIT_ENCOUNTER,
)
s_new_part = s_new_narr_transcript.replace(s_narr_transcript, "")
s_narr_transcript += s_new_part + "\n"
s_user_transcript += s_new_part + "\n"
did_user_kill = decider_utils.yesno(QUESTION_DID_PROTAGONIST_KILL, s_new_part, default=NO)
did_user_kill = did_user_kill or decider_utils.yesno(QUESTION_DID_PROTAGONIST_KILL, s_narr_transcript, default=NO)
if did_user_kill:
finally_add2_both_tscripts += game_over_fail_txt("You have taken a life.")
else:
is_user_home = decider_utils.yesno(QUESTION_IS_USER_HOME, s_narr_transcript, default=NO)
if is_user_home:
has_at_least_30_gold = decider_utils.yesno(QUESTION_DOES_USER_STILL_HAVE_AT_LEAST_30_GOLD, s_narr_transcript, default=NO)
if has_at_least_30_gold:
finally_add2_both_tscripts += game_over_victory_txt("You made it home with 30+ gold! Your family is grateful and you all hug in celebration.")
else:
finally_add2_both_tscripts += game_over_fail_txt("You reached home with less than 30 gold - too little for your family to live on.")
# End of code block User input accepted.
s_n_turns_elapsed = str(n_turns_elapsed)
s_user_input = ""
if S_GAME_OVER not in finally_add2_both_tscripts and S_GAME_OVER not in s_narr_transcript:
finally_add2_both_tscripts += AWAITING_INPUT
s_narr_transcript += finally_add2_both_tscripts
s_user_transcript += finally_add2_both_tscripts
return [s_narr_transcript, s_n_turns_elapsed, s_user_transcript, s_user_input]
openai.organization = os.environ.get("OPENAI_ORGANIZATION")
openai.api_key = os.environ.get("OPENAI_KEY")
demo = gr.Blocks()
with demo:
gr_top_of_scr_padding = gr.HTML(TOP_OF_SCREEN_PADDING_DIV)
gr_narr_transcript = gr.Textbox(label="", value="", interactive=False, max_lines=9999, visible=False)
gr_user_transcript = gr.Textbox(label="", value=INITIAL_WELCOME_TEXT, interactive=False, max_lines=9999, elem_classes="parleygame")
gr_pls_be_patient = gr.HTML(PLEASE_BE_PATIENT_DIV)
gr_user_input = gr.Textbox(label="", value="", placeholder="Describe your next action here...", interactive=True)
gr_button1 = gr.Button(value="Run Next Turn")
gr_n_turns_elapsed = gr.Textbox(label="N Turns Elapsed", value="0", interactive=False)
gr_button1.click(
fn=run_1_game_turn, inputs=[gr_narr_transcript, gr_n_turns_elapsed, gr_user_transcript, gr_user_input], outputs=[gr_narr_transcript, gr_n_turns_elapsed, gr_user_transcript, gr_user_input]
)
# See https://discuss.huggingface.co/t/gradio-html-component-with-javascript-code-dont-work/37316/2
demo.load(None, None, None, _js=PAGE_STYLING_JS)
demo.launch()
|