ScienceWorld / app.py
Marc-Alexandre Côté
Add autoscrolling and rearrange score location
3b2cf81
raw
history blame
2.55 kB
import streamlit as st
import streamlit.components.v1 as components
from scienceworld import ScienceWorldEnv
description = """
[Project Page](https://sciworld.apps.allenai.org) | [ArXiv Paper](https://arxiv.org/abs/2203.07540) | [Github Repo](https://github.com/allenai/ScienceWorld)
"""
st.title("ScienceWorld Demo")
st.markdown(description)
# Apply custom CSS.
with open('style.css')as f:
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
env = st.session_state.get("env")
if env is None:
env = ScienceWorldEnv("")
st.session_state["env"] = env
seed = st.session_state.get("seed")
obs = st.session_state.get("obs")
infos = st.session_state.get("infos")
history = st.session_state.get("history")
if history is None:
history = []
st.session_state["history"] = history
def clear_history():
history.clear()
with st.sidebar:
st.title("ScienceWorld Demo")
st.markdown(description)
task = st.selectbox("Task:", env.getTaskNames(), on_change=clear_history)
if len(history) == 0:
env.load(task, 0, "")
obs, infos = env.reset()
st.session_state["obs"] = obs
st.session_state["infos"] = infos
history.append(("", env.getTaskDescription()))
history.append(("look around", obs))
def step():
act = st.session_state.action
if act:
obs, reward, done, infos = env.step(act)
history.append((act, obs))
st.session_state["obs"] = obs
st.session_state["infos"] = infos
if act == "reset":
clear_history()
with st.sidebar:
st.warning(env.getTaskDescription())
st.success(f"Score: {infos['score']}")
valid_actions = [""] + sorted(infos["valid"])
if infos['score'] == 100:
valid_actions = ["", "reset"]
# act = st.selectbox('Action:', options=valid_actions, index=0, on_change=step, key="action")
for act, obs in history:
if act:
st.write("> " + act)
if obs:
st.info(obs.replace('\n\t', '\n- '))
act = st.selectbox('Action:', options=valid_actions, index=0, on_change=step, key="action")
st.warning(f"Current score: {infos['score']} out of 100")
if infos['score'] == 100:
with st.sidebar:
st.balloons()
st.success("Congratulations! You have completed the task.")
# Auto scroll at the bottom of the page.
components.html(
f"""
<p>{st.session_state.obs}</p>
<script>
window.parent.document.querySelector('section.main').scrollTo(0, window.parent.document.querySelector('section.main').scrollHeight);
</script>
# """,
height=0
)