Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/sotopia demo UI #261

Merged
merged 67 commits into from
Dec 31, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
a693fe2
initial
XuhuiZhou Oct 29, 2024
b2c422e
initial ui
XuhuiZhou Oct 30, 2024
df5f989
Merge branch 'main' into feature/sotopia-demo-ui
XuhuiZhou Dec 4, 2024
950830c
merge main
XuhuiZhou Dec 4, 2024
71483d9
add new ui
XuhuiZhou Dec 4, 2024
2e2514f
switch to fastAPI
XuhuiZhou Dec 4, 2024
e8fff7b
websocket check
XuhuiZhou Dec 5, 2024
878eb88
Merge branch 'demo' into feature/sotopia-demo-ui
XuhuiZhou Dec 7, 2024
79e9986
fix render episode error
XuhuiZhou Dec 7, 2024
f29f7f7
add page; make a simplified page and still WIP
bugsz Dec 9, 2024
99b58ba
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 9, 2024
3cc6dc0
fix simplified streaming version
bugsz Dec 10, 2024
4b54e44
semi-done character page + avatar assets
astrophie Dec 10, 2024
f77e302
Fixed character card styling
astrophie Dec 11, 2024
380b94c
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 11, 2024
756a749
unified rendering and chat display
bugsz Dec 11, 2024
02c76da
Merge branch 'feature/sotopia-demo-ui' of https://github.com/sotopia-…
bugsz Dec 11, 2024
3f7214e
updated chat character icons
astrophie Dec 11, 2024
d9b6204
add some tags
XuhuiZhou Dec 11, 2024
ceaabde
Merge branch 'feature/sotopia-demo-ui' of github.com:sotopia-lab/soto…
XuhuiZhou Dec 11, 2024
871fc1f
add typing
XuhuiZhou Dec 12, 2024
b372f2f
temp fix
XuhuiZhou Dec 12, 2024
69888db
add characters avatar to simulation
XuhuiZhou Dec 12, 2024
9764c34
fix episode full avatar
XuhuiZhou Dec 12, 2024
57dc305
go to modal config
XuhuiZhou Dec 14, 2024
dca51a9
clean up code
bugsz Dec 14, 2024
d15fd83
manually merge branch
bugsz Dec 14, 2024
fa625be
add modal streamlit app
bugsz Dec 14, 2024
9ba63f9
clean codebase except websocket
XuhuiZhou Dec 14, 2024
c7850bb
remove repeated local css
XuhuiZhou Dec 14, 2024
6384eb6
clean websocket
XuhuiZhou Dec 14, 2024
7aa64ec
fix get name error
XuhuiZhou Dec 14, 2024
5b48f30
fix errors
XuhuiZhou Dec 15, 2024
563af64
pre render scenario
XuhuiZhou Dec 15, 2024
1d743c0
add custom eval
XuhuiZhou Dec 15, 2024
9e3651b
Merge branch 'demo' into feature/sotopia-demo-ui
XuhuiZhou Dec 15, 2024
cb54051
change streamlit to dynamic path
bugsz Dec 15, 2024
e2575ea
new uv
XuhuiZhou Dec 15, 2024
116fa77
revert to previous install commands
bugsz Dec 15, 2024
d3c987b
Merge branch 'feature/sotopia-demo-ui' of https://github.com/sotopia-…
bugsz Dec 15, 2024
f64e715
a fix for modal
XuhuiZhou Dec 15, 2024
eccba6a
add customized dimension
bugsz Dec 15, 2024
a1c1de1
Merge branch 'feature/sotopia-demo-ui' of https://github.com/sotopia-…
bugsz Dec 15, 2024
1810999
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 15, 2024
f4eee2d
sort scenarios in simulation
bugsz Dec 15, 2024
aa8f1bb
Merge branch 'feature/sotopia-demo-ui' of https://github.com/sotopia-…
bugsz Dec 15, 2024
ed5168e
for demo video
XuhuiZhou Dec 15, 2024
0b12ccd
update deploy instruction
bugsz Dec 16, 2024
1069f6c
update intro page
bugsz Dec 16, 2024
466b6f9
update intro page
bugsz Dec 16, 2024
733074d
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 16, 2024
e3a7651
update intro page
bugsz Dec 19, 2024
9464ab3
Merge branch 'feature/sotopia-demo-ui' of https://github.com/sotopia-…
bugsz Dec 19, 2024
5079726
add customized dimensions
bugsz Dec 19, 2024
79aa67f
update api link and modal environment
bugsz Dec 22, 2024
88a80a3
move folder
XuhuiZhou Dec 22, 2024
eb3700d
fix relative import
XuhuiZhou Dec 22, 2024
e144682
update modal image build
bugsz Dec 25, 2024
b6c703b
Merge branch 'feature/sotopia-demo-ui' of https://github.com/sotopia-…
bugsz Dec 25, 2024
6d0ae1f
use uv to build environment
bugsz Dec 26, 2024
9ef75c4
change folder name
XuhuiZhou Dec 28, 2024
69d1124
Merge branch 'demo' into feature/sotopia-demo-ui
XuhuiZhou Dec 28, 2024
f8d9c0f
change test
XuhuiZhou Dec 28, 2024
f55e183
fix modal serve
XuhuiZhou Dec 28, 2024
3917d7b
environment change
XuhuiZhou Dec 28, 2024
6e620d6
refactor
XuhuiZhou Dec 28, 2024
5219d40
fix ui
XuhuiZhou Dec 31, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 30 additions & 22 deletions sotopia/ui/streamlit_ui/pages/render_chat_websocket_simplified.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
import aiohttp
import requests
import streamlit as st
import time

from sotopia.ui.streamlit_ui.utils import get_abstract

chat_container = st.empty()
from sotopia.ui.streamlit_ui.rendering.render_episode import rendering_episode_full
from sotopia.database import EpisodeLog


def compose_agent_names(agent_dict: dict[Any, Any]) -> str:
Expand Down Expand Up @@ -61,14 +62,16 @@ def initialize_session_state() -> None:
print("Session state initialized")


def parse_messages(messages: list[dict[str, Any]]) -> list[dict[str, Any]]:
chat_history_container = st.empty()


def parse_messages(messages: list[str]) -> list[dict[str, Any]]:
chat_messages = []
messages = messages[1:]
messages = [message for message in messages[1:] if message != ""]
evaluation_available = len(messages) >= 2 and "Agent 1 comments" in messages[-2]
evaluations = [] if not evaluation_available else messages[-2:]
conversations = messages if not evaluation_available else messages[:-2]

# print(messages)
chat_messages = [
{"role": "human", "content": message} for message in conversations
] + [
Expand Down Expand Up @@ -124,27 +127,25 @@ async def run_simulation():
break

if message["data"]["type"] == "messages":
st.session_state.messages = parse_messages(
message["data"]["messages"]
)
epilog = EpisodeLog(**message["data"]["messages"])
st.session_state.messages = epilog
with chat_history_container.container():
rendering_episode_full(epilog)

elif msg.type in (aiohttp.WSMsgType.CLOSED, aiohttp.WSMsgType.ERROR):
break

if st.session_state.get("stop_sim", False):
await ws.send_str(json.dumps({"type": "FINISH_SIM", "data": ""}))

with chat_container.container():
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])


def start_callback() -> None:
if st.session_state.agent_choice_1 == st.session_state.agent_choice_2:
st.error("Please select different agents")
else:
st.session_state.active = True
st.session_state.stop_sim = False
st.session_state.messages = []
st.session_state.messages = None
try:
asyncio.run(run_simulation())
except Exception as e:
Expand All @@ -155,12 +156,6 @@ def start_callback() -> None:

def stop_callback() -> None:
st.session_state.stop_sim = True
st.session_state.websocket_manager.send_message(
{
"type": "FINISH_SIM",
"data": "",
}
)


def is_active() -> bool:
Expand Down Expand Up @@ -240,9 +235,22 @@ def chat_demo() -> None:
on_click=stop_callback,
)

with chat_container.container():
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
# if is_active():
# try:
# asyncio.run(run_simulation())
# except Exception as e:
# st.error(f"Error running simulation: {e}")
# finally:
# st.session_state.active = False

while is_active() and st.session_state.messages:
with chat_history_container.container():
rendering_episode_full(st.session_state.messages)
time.sleep(1)

if st.session_state.messages:
with chat_history_container.container():
rendering_episode_full(st.session_state.messages)


chat_demo()
86 changes: 86 additions & 0 deletions sotopia/ui/streamlit_ui/rendering/render_episode.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,92 @@ def rendering_episode(episode: EpisodeLog) -> None:
)


def rendering_episode_full(episode: EpisodeLog) -> None:
XuhuiZhou marked this conversation as resolved.
Show resolved Hide resolved
print("Episode: ", episode)
agents = [AgentProfile.get(agent) for agent in episode.agents]
agent_names = [get_full_name(agent) for agent in agents]
environment = EnvironmentProfile.get(episode.environment)

avatar_mapping = {
agent_names[0]: "πŸ§”πŸ»",
agent_names[1]: "πŸ§‘",
}

messages = render_for_humans(episode)

background_messages = [
message for message in messages if message["role"] == "Background Info"
]
evaluation_messages = [
message for message in messages if message["type"] == "comment"
]
conversation_messages = [
message
for message in messages
if message not in background_messages and message not in evaluation_messages
]

assert (
len(background_messages) == 2
), f"Need 2 background messages, but got {len(background_messages)}"

print(f"\n\ENVIRONMENT {environment}")

rendering_episode(episode)

st.markdown("---")

st.subheader("Conversation & Evaluation")
with st.expander("Conversation", expanded=True):
for index, message in enumerate(conversation_messages):
role = role_mapping.get(message["role"], message["role"])
content = message["content"]

if role == "obs" or message.get("type") == "action":
try:
content = json.loads(content)
except Exception as e:
print(e)

with st.chat_message(
role, avatar=avatar_mapping.get(message["role"], None)
):
if isinstance(content, dict):
st.json(content)
elif role == "info":
st.markdown(
f"""
<div style="background-color: lightblue; padding: 10px; border-radius: 5px;">
{content}
</div>
""",
unsafe_allow_html=True,
)
else:
if role == agent_names[1]:
# add background grey color
st.write(f"**{role}**")
st.markdown(
f"""
<div style="background-color: lightgrey; padding: 10px; border-radius: 5px;">
{content}
</div>
""",
unsafe_allow_html=True,
)
else:
st.write(f"**{role}**")
st.markdown(
content.replace("\n", "<br />"), unsafe_allow_html=True
)

with st.expander("Evaluation Results", expanded=True):
for message in evaluation_messages:
st.markdown(
message["content"].replace("\n", "<br />"), unsafe_allow_html=True
)


def rendering_episodes() -> None:
local_css("./././css/style.css")

Expand Down
12 changes: 6 additions & 6 deletions sotopia/ui/websocket_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,11 +158,11 @@ async def arun(self) -> AsyncGenerator[dict[str, Any], None]:

async for messages in await generator: # type: ignore
reasoning, rewards = "", [0.0, 0.0]
eval_available = False
# eval_available = False
if messages[-1][0][0] == "Evaluation":
reasoning = messages[-1][0][2].to_natural_language()
rewards = eval(messages[-2][0][2].to_natural_language())
eval_available = True
# eval_available = True

epilog = EpisodeLog(
environment=self.env.profile.pk,
Expand All @@ -177,11 +177,11 @@ async def arun(self) -> AsyncGenerator[dict[str, Any], None]:
rewards=rewards,
rewards_prompt="",
)
agent_profiles, parsed_messages = epilog.render_for_humans()
if not eval_available:
parsed_messages = parsed_messages[:-2]
# agent_profiles, parsed_messages = epilog.render_for_humans()
# if not eval_available:
# parsed_messages = parsed_messages[:-2]

yield {
"type": "messages",
"messages": parsed_messages,
"messages": epilog.dict(),
}