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()