File size: 2,679 Bytes
81e1c72
380be21
 
81e1c72
380be21
1373c22
81e1c72
 
21c7651
380be21
1af1cee
380be21
 
81e1c72
 
 
 
 
21c7651
 
 
81e1c72
 
380be21
dd5d973
81e1c72
 
c6447fa
dd5d973
 
81e1c72
 
 
 
380be21
 
81e1c72
c6447fa
 
 
380be21
 
81e1c72
380be21
 
 
 
 
 
 
 
 
 
 
 
dd5d973
 
 
 
21c7651
 
 
 
dd5d973
 
81e1c72
 
dd5d973
 
 
380be21
81e1c72
dd5d973
f975b0f
c6447fa
 
 
81e1c72
380be21
7275c7f
380be21
184f405
 
 
bfe0881
 
184f405
 
 
 
 
 
 
65b412a
 
184f405
 
 
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
from typing import Type

import streamlit as st
from streamlit import session_state

from game_chameleon import ChameleonGame
from agent_interfaces import HumanAgentInterface
from message import Message
from prompts import fetch_prompt

st.set_page_config(layout="wide", page_title="Chameleon")


def display_message(message: Message):
    if message.type == "verbose":
        messages_container.markdown(f":green[{message.content}]")
    elif message.type == "debug":
        messages_container.markdown(f":orange[DEBUG: {message.content}]")
    elif message.type == "system":
        # Don't display system message as it is displayed in the "How to Play" expander
        pass
    else:
        messages_container.markdown(f"{message.content}")


if "messages" not in session_state:
    session_state.messages = []
    session_state.user_input = None


class StreamlitInterface(HumanAgentInterface):
    def add_message(self, message: Message):
        super().add_message(message)
        session_state.messages.append(message)
        display_message(message)

    def _generate(self) -> str:
        response = session_state.user_input
        session_state.user_input = None
        return response


# Streamlit App

margin_size = 1
center_size = 3

title_left, title_center, title_right = st.columns([margin_size, center_size, margin_size])

with title_center:
    st.markdown("# :rainbow[Chameleon]")

left, center, right = st.columns([margin_size, center_size, margin_size])

with center:
    messages_container = st.container()

    messages_container.write("Welcome to Chameleon! A social deduction game powered by LLMs.")

    rules_expander = messages_container.expander("How to Play", expanded=False)

    rules_expander.markdown(fetch_prompt("game_rules"))

    messages_container.write("Enter your name to begin...")

    user_input = st.chat_input("Your response:")

    if st.session_state.messages:
        for message in st.session_state.messages:
            display_message(message)

if user_input:
    if "game" not in st.session_state:
        st.session_state.game = ChameleonGame.from_human_name(user_input, StreamlitInterface)
    else:
        session_state.user_input = user_input

    st.session_state.game.run_game()

st.markdown("#")

footer="""<style>
.footer {
position: fixed;
background-color: #0E1117;
padding-top: 10px;
left: 0;
bottom: 0;
width: 100%;
text-align: center;
}
</style>
<div class="footer">
<p style="margin: 0;">Created by <a href="https://huggingface.co/ericbotti" target="_blank">Eric Botti</a></p>
<small>Your responses may be collected for research purposes</small>
</div>
"""
st.markdown(footer, unsafe_allow_html=True)