Spaces:
Runtime error
Runtime error
File size: 5,194 Bytes
240a6d2 7f68889 240a6d2 7f68889 240a6d2 7f68889 240a6d2 a91a9d4 240a6d2 05371a1 240a6d2 05371a1 240a6d2 05371a1 240a6d2 05371a1 240a6d2 05371a1 240a6d2 05371a1 240a6d2 05371a1 240a6d2 |
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 |
import streamlit as st
import openai
import os
openai.api_key = os.getenv("openai_api")
BATTLE_SEXES_PAYOFF = {
("J", "J"): (10, 7),
("J", "F"): (0, 0),
("F", "J"): (0, 0),
("F", "F"): (7, 10)
}
PRISONERS_DILEMMA_PAYOFF = {
("J", "J"): (8, 8), # Both cooperate
("J", "F"): (0, 10), # Player 1 cooperates, Player 2 defects
("F", "J"): (10, 0), # Player 1 defects, Player 2 cooperates
("F", "F"): (5, 5) # Both defect
}
PAYOFF = PRISONERS_DILEMMA_PAYOFF
def generate_player_description(player):
descriptions = []
for (p1_choice, p2_choice), (p1_points, p2_points) in PAYOFF.items():
if player == 1:
description = f"If you choose Option {p1_choice} and the other player chooses Option {p2_choice}, then you win {p1_points} points and the other player wins {p2_points} points."
elif player == 2:
description = f"If you choose Option {p2_choice} and the other player chooses Option {p1_choice}, then you win {p2_points} points and the other player wins {p1_points} points."
descriptions.append(description)
return "\n".join(descriptions)
def gpt_play(player, round_num, last_round,model):
game_rules = f'''You are playing a game repeatedly with another player. Be aware that the other player can make
mistakes sometimes. In this game, you can choose either Option J or Option F. The rules of the game are:'''
player_description = generate_player_description(player)
previous_round = ''
if last_round:
if player == 1:
previous_round = f"In round {round_num-1}, you chose Option {last_round[0]} and the other player chose Option {last_round[1]}. Thus, you won {PAYOFF[last_round][0]} points and the other player won {PAYOFF[last_round][1]} points."
elif player == 2:
previous_round = f"In round {round_num-1}, you chose Option {last_round[1]} and the other player chose Option {last_round[0]}. Thus, you won {PAYOFF[last_round][1]} points and the other player won {PAYOFF[last_round][0]} points."
prompt = f"{game_rules}\n{player_description}\n{previous_round}\nYou are currently playing round {round_num}.\n\nQuestion: Based on the rules, which Option do you choose for this round, Option J or Option F ? Answer only \"J\" or \"F\"\n\nAnswer: "
#print(f"Below is the prompt for Player {player} and Round {round_num}:\n {prompt}")
completion = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": ""},#f"{game_rules}\n\n{player_description}"
{"role": "user", "content": prompt}
],
temperature = 0,
max_tokens = 5
)
move = completion.choices[0].message['content']
#print(f"{move}\n")
if "J" in move:
move = "J"
else:
move = "F"
return move
def main():
st.title("LLM Game Simulator")
# Dropdown menu to select the game or custom matrix
game_option = st.selectbox(
'Which game do you want to simulate?',
('Prisoner\'s Dilemma', 'Battle of the Sexes', 'Custom Matrix')
)
if game_option == 'Prisoner\'s Dilemma':
PAYOFF = PRISONERS_DILEMMA_PAYOFF
elif game_option == 'Battle of the Sexes':
PAYOFF = BATTLE_SEXES_PAYOFF
elif game_option == 'Custom Matrix':
jj = st.text_input("Enter payoff for (J, J) as 'x,y':")
jf = st.text_input("Enter payoff for (J, F) as 'x,y':")
fj = st.text_input("Enter payoff for (F, J) as 'x,y':")
ff = st.text_input("Enter payoff for (F, F) as 'x,y':")
# Check if all inputs are filled
if not all([jj, jf, fj, ff]):
st.warning("Please fill in all the custom matrix values before starting the simulation.")
return
try:
PAYOFF = {
("J", "J"): tuple(map(int, jj.split(','))),
("J", "F"): tuple(map(int, jf.split(','))),
("F", "J"): tuple(map(int, fj.split(','))),
("F", "F"): tuple(map(int, ff.split(',')))
}
except ValueError:
st.error("Invalid custom matrix values. Please provide values in the format 'x,y'.")
return
model_option = st.selectbox(
'Which model version would you like to use?',
('gpt-4', 'gpt-3.5-turbo')
)
rounds = st.slider('Number of rounds to play', min_value=1, max_value=100, value=10, step=1)
if st.button('Start Simulation'):
st.write(f"Simulating {game_option} for {rounds} rounds using {model_option}.")
last_round = None
for i in range(rounds):
player1_move = gpt_play(1, i + 1, last_round, model=model_option)
player2_move = gpt_play(2, i + 1, last_round, model=model_option)
last_round = (player1_move, player2_move)
score_p1, score_p2 = PAYOFF[last_round]
st.write(
f"Round {i + 1}: Player 1 chose {player1_move} and won {score_p1} points. Player 2 chose {player2_move} and won {score_p2} points.")
st.write("Simulation complete!")
if st.button('Reset'):
st.experimental_rerun()
if __name__ == "__main__":
main()
|