File size: 2,863 Bytes
380be21
9e6c181
380be21
 
9e6c181
380be21
 
 
9e6c181
 
380be21
 
 
 
 
 
 
 
 
 
dd5d973
380be21
dd5d973
 
 
 
 
 
 
 
 
 
 
 
 
 
380be21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd5d973
 
 
 
380be21
 
 
 
 
 
 
 
 
 
 
 
dd5d973
 
 
 
 
 
 
 
 
380be21
dd5d973
 
380be21
dd5d973
 
 
 
380be21
dd5d973
380be21
 
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
import asyncio
from time import sleep

import streamlit as st
from langchain_core.messages import AIMessage

from game import Game

st.set_page_config(layout="wide", page_title="Chameleon", page_icon="img/logo.svg")
human_turn = False


def display_message(message):
    if message["type"] == "game":
        messages_container.markdown(f"{message['content']}")
    elif message["type"] == "verbose":
        messages_container.markdown(f":green[{message['content']}]")
    elif message["type"] == "debug":
        messages_container.markdown(f":orange[DEBUG: {message['content']}]")


class StreamlitGame(Game):
    @staticmethod
    async def human_input(prompt: str) -> str:
        _user_input = st.chat_input("Your message", key=f"user_input_{st.session_state.user_input_id}")
        st.session_state.user_input_id += 1

        while _user_input is None or _user_input == "":
            sleep(0.1)

        print(f"User input: {_user_input}")

        response = AIMessage(content=_user_input)

        return response

    def human_message(self, message: str):
        message = {"type": "game", "content": message}
        st.session_state["messages"].append(message)
        display_message(message)

    def verbose_message(self, message: str):
        if self.verbose:
            message = {"type": "verbose", "content": message}
            st.session_state["messages"].append(message)
            display_message(message)

    def debug_message(self, message: str):
        if self.debug:
            message = {"type": "debug", "content": message}
            st.session_state["messages"].append(message)
            display_message(message)


if "messages" not in st.session_state:
    st.session_state["messages"] = []
if "game_started" not in st.session_state:
    st.session_state["game_started"] = False
if "user_input_id" not in st.session_state:
    st.session_state["user_input_id"] = 0

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.")

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

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

    user_input = st.chat_input("Your message")
    st.session_state.user_input_id += 1

if not st.session_state.game_started and user_input:
    st.session_state.game_started = True
    if "game" not in st.session_state:
        st.session_state.game = StreamlitGame(human_name=user_input, verbose=True)

    asyncio.run(st.session_state.game.start())