NimGPT-3.5 / app.py
JLW's picture
Update logging
6198c2d
import gradio as gr
import datetime
from nim_game_env import NimGameEnv
from nim_gpt_functions import plan_move, execute_move
TEMPERATURE_DEFAULT = 0.5
PILES_DEFAULT = [3, 5, 7]
HUMAN_STR = "Human"
AI_STR = "AI"
def reset_game(chat_history, nim_game_env):
chat_history = []
nim_game_env = NimGameEnv(PILES_DEFAULT)
game_state_text, game_state_piles = nim_game_env.reset()
ascii_art = generate_game_state_ascii_art(game_state_piles, False, 0, "")
message_str = ""
return chat_history, chat_history, message_str, ascii_art, nim_game_env
def generate_game_state_ascii_art(piles, done, reward, player):
ascii_art = "Game Over, " + player + " wins!"
if not done:
pile_a = piles[0]
pile_b = piles[1]
pile_c = piles[2]
ascii_art = f"Pile A: {'|' * pile_a} \nPile B: {'|' * pile_b} \nPile C: {'|' * pile_c}"
return "<pre>" + ascii_art + "</pre>"
def send_chat_msg(inp, chat_history, nim_game_env, temperature, openai_api_key):
if not openai_api_key or openai_api_key == "":
warning_msg = "<pre>Please paste your OpenAI API key (see https://beta.openai.com)</pre>"
return chat_history, chat_history, warning_msg
if not inp or inp == "":
warning_msg = "<pre>Please enter a move</pre>"
return chat_history, chat_history, warning_msg
inp = inp.strip()
output = None
chat_history = chat_history or []
text_obs, observation, reward, done, info = execute_move(inp, nim_game_env, openai_api_key)
ascii_art = generate_game_state_ascii_art(observation, done, reward, HUMAN_STR)
if done:
if reward == 1:
output = "Good game!"
ascii_art = generate_game_state_ascii_art(observation, done, reward, HUMAN_STR)
else:
output = text_obs
ascii_art = generate_game_state_ascii_art(observation, done, reward, AI_STR)
else:
output = plan_move(text_obs, temperature, openai_api_key)
text_obs, observation, reward, done, info = execute_move(output, nim_game_env, openai_api_key)
ascii_art = generate_game_state_ascii_art(observation, done, reward, AI_STR)
print("\n==== date/time: " + str(datetime.datetime.now() - datetime.timedelta(hours=5)) + " ====")
print("inp: " + inp, ", output: ", output, ", observation: ", observation)
chat_history.append((HUMAN_STR + ": " + inp, AI_STR + ": " + output))
return chat_history, chat_history, ascii_art
def update_foo(widget, state):
if widget:
state = widget
return state
block = gr.Blocks(css=".gradio-container {background-color: lightgray}")
with block as nim_game:
temperature_state = gr.State(TEMPERATURE_DEFAULT)
openai_api_key_state = gr.State()
history_state = gr.State()
nim_game_env_state = gr.State(NimGameEnv(PILES_DEFAULT))
with gr.Row():
game_state_html = gr.Markdown()
title = gr.Markdown("""<h3><center>NimGPT-3.5</center></h3>""")
openai_api_key_textbox = gr.Textbox(placeholder="Paste your OpenAI API key",
show_label=False, lines=1, type='password')
chatbot = gr.Chatbot()
with gr.Row():
message_tb = gr.Textbox(label="What's your move?",
placeholder="I'll take 2 sticks from pile A")
send_btn = gr.Button(value="Send", variant="secondary").style(full_width=False)
with gr.Row():
gr.Examples(
examples=["Three sticks from the second pile",
"From pile C remove 2 sticks"],
inputs=message_tb
)
reset_btn = gr.Button(value="Reset Game", variant="secondary").style(full_width=False)
temperature_slider = gr.Slider(label="GPT Temperature", value=TEMPERATURE_DEFAULT, minimum=0.0, maximum=1.0,
step=0.1)
send_btn.click(send_chat_msg, inputs=[message_tb, history_state, nim_game_env_state, temperature_state,
openai_api_key_state],
outputs=[chatbot, history_state, game_state_html])
message_tb.submit(send_chat_msg, inputs=[message_tb, history_state, nim_game_env_state, temperature_state,
openai_api_key_state],
outputs=[chatbot, history_state, game_state_html])
reset_btn.click(reset_game, inputs=[history_state, nim_game_env_state],
outputs=[chatbot, history_state, message_tb, game_state_html, nim_game_env_state])
nim_game.load(reset_game, inputs=[history_state, nim_game_env_state],
outputs=[chatbot, history_state, message_tb, game_state_html, nim_game_env_state])
gr.Markdown("""<center>Each player may remove sticks from a pile on their turn.
Player to remove the last stick wins.
<a href="https://en.wikipedia.org/wiki/Nim" target="new">
Nim is one of the first-ever electronic computerized games</a>
</center>""")
gr.HTML("<center>Powered by <a href='https://github.com/hwchase17/langchain'>LangChain πŸ¦œοΈπŸ”—</a></center>")
openai_api_key_textbox.change(update_foo,
inputs=[openai_api_key_textbox, openai_api_key_state],
outputs=[openai_api_key_state])
temperature_slider.change(update_foo,
inputs=[temperature_slider, temperature_state],
outputs=[temperature_state])
block.launch(debug=False)