Spaces:
Runtime error
Runtime error
import streamlit as st | |
import pandas as pd | |
import plotly.express as px | |
import time | |
import ast # To safely evaluate string literals as Python expressions | |
st.set_page_config(layout="wide") | |
st.title("Games - Gemini Ultra Simulator") | |
positions_text = """Agents: Clara (-3,3), Eddie (3,3), Sofia (-3,-3), Alex (3,-3)""" | |
# Load the positions data from the specified path | |
positions_df = pd.read_csv('./data/positions.csv') | |
# Correctly use the 'positions' column name with lowercase 'p' for the ast.literal_eval conversion | |
positions_df['positions'] = positions_df['positions'].apply(ast.literal_eval) | |
# Initialize or get the current animation state (paused or playing) | |
if 'paused' not in st.session_state: | |
st.session_state['paused'] = False | |
# Create two columns in the Streamlit app | |
left_column, right_column = st.columns(2) | |
# Define the text you want to display in the text box | |
course_goal = """ | |
I am developing a course focused on conducting effective meetings. To achieve this, I require a team of specialists, each assigned roles that are instrumental in the course development process, such as author, editor, critic, and so forth. I need detailed profiles for these team members, including their names, assigned tasks, goals, and backstories. | |
""" | |
course_agents = """ | |
1. Agent Name: Clara "The Conductor" Williams | |
Role: Lead Author | |
Tasks: | |
- Develop core course outline | |
- Create engaging lesson plans & activities | |
- Research and integrate best practices | |
- Write clear and concise scripts | |
Goals: | |
- Make meetings a source of productivity, not dread | |
- Transform meeting culture in workplaces | |
Backstory: Ex-management consultant frustrated with wasted hours in unproductive meetings. Passionate about efficiency and turning meetings into problem-solving powerhouses. | |
2. Agent Name: Eddie "Eagle Eye" Thompson | |
Role: Editor & Quality Control | |
Tasks: | |
- Review content for clarity and flow | |
- Ensure examples are relevant and impactful | |
- Fact-check all information | |
- Maintain consistent course voice/tone | |
Goals: | |
- Deliver a polished and credible course | |
- Catch any errors or inconsistencies | |
Backstory: Former journalist with a keen eye for detail and accuracy. Believes that well-crafted content is essential for effective learning. | |
3. Agent Name: Sofia "The Skeptic" Ramirez | |
Role: Critic and User Advocate | |
Tasks: | |
- Ask tough questions about content and approach | |
- Challenge assumptions about learner needs | |
- Test activities, visuals, and examples for usability | |
- Provide feedback from a realistic learner's perspective | |
Goals: | |
- Bulletproof the course against common pitfalls | |
- Ensure it resonates with diverse audiences | |
Backstory: Seasoned HR professional who's seen the good, the bad, and the ugly of workplace meetings. Wants courses to be truly transformative, not just theoretical. | |
4. Agent Name: Alex "The Innovator" Kim | |
Role: Multimedia Specialist | |
Tasks: | |
- Design engaging visuals (infographics, illustrations) | |
- Source or create short video clips | |
- Develop interactive elements | |
- Ensure seamless integration of multimedia into the course | |
Goals: | |
- Break down complex concepts visually | |
- Make the course dynamic and memorable | |
Backstory: Graphic designer turned instructional design enthusiast. Believes learning should be as visually appealing as it is informative. | |
""" | |
course_outline = """ | |
Module 1: The Meeting Mindset | |
Step 1: Why Meetings (Sometimes) Get a Bad Rap | |
Common meeting complaints and frustrations | |
The true costs of unproductive meetings | |
The potential benefits of well-run meetings | |
Step 2: Before You Hit "Schedule": Meeting or Memo? | |
Decision tree: Does this topic truly need a meeting? | |
When asynchronous communication is better | |
Alternatives to traditional meetings (standups, quick huddles, etc.) | |
Step 3: The Power of Purpose | |
Defining clear meeting goals (decision-making, information sharing, brainstorming, etc.) | |
SMART objectives for meetings | |
Module 2: Preparation is Everything | |
Step 1: The Anatomy of an Effective Agenda | |
Template and samples of great agendas | |
Time allocation and prioritization | |
Building in time for discussion, not just report-outs | |
Step 2: Right People, Right Roles | |
Avoiding the "invite everyone" trap | |
Identifying essential attendees vs. optional | |
Assigning pre-meeting prep (if needed) | |
Step 3: Setting the Stage | |
Tech checks for smoother virtual meetings | |
Room setup considerations (in-person) | |
Module 3: Masterful Meeting Facilitation | |
Step 1: Strong Starts and Focused Guidance | |
Opening the meeting with purpose | |
Ground rules and participation norms | |
Techniques to keep things on track | |
Step 2: Inclusive Participation | |
Encouraging contributions from all attendees | |
Dealing with dominant personalities tactfully | |
Handling tangents and side conversations | |
Step 3: Decision-Making and Action Items | |
Reaching consensus vs. voting | |
Clear ownership of action items | |
Summarizing key takeaways | |
Module 4: Dealing with Disruptions | |
Step 1: Common Meeting Derailers | |
The rambler, the tech difficulties, the unprepared, etc. | |
Strategies for addressing each with respect | |
Step 2: Conflict and Difficult Dynamics | |
Diffusing tension | |
When to table topics for later | |
Step 3: Debrief and Improvement | |
Quick post-meeting evaluation | |
Implementing feedback for future meetings | |
""" | |
# Use the text_area widget to display the information in a non-editable, scrollable text box | |
common_goal = left_column.text_area("Goal", value=course_goal, height=100) | |
common_agents = left_column.text_area("Agents", value=course_agents, height=400) | |
common_outline= left_column.text_area("Chain of Thought Outline", value=course_outline, height=400) | |
# Move the pause/play button under the common goal on the right side | |
#if left_column.button('Pause' if not st.session_state['paused'] else 'Play'): | |
# st.session_state['paused'] = not st.session_state['paused'] | |
# Placeholder for the Plotly chart in the right column | |
chart_placeholder = right_column.empty() | |
markdonw_position = right_column.markdown(f"```\n{positions_text}\n```") | |
animation_speed = right_column.slider("Animation Speed (Seconds per Frame)", 1, 10, 2, key='animation_speed') | |
# Placeholder for displaying additional data below the chart. | |
data_placeholder = right_column.empty() | |
# Placeholder for displaying the data below the animation | |
data_placeholder = right_column.empty() | |
# Initialize an index to keep track of the current frame (row) to display | |
current_frame = 0 | |
while True: | |
if not st.session_state['paused']: | |
# Fetch the current row based on the frame index | |
row = positions_df.iloc[current_frame % len(positions_df)] | |
positions = row['positions'] # Access the 'positions' column with lowercase 'p' | |
# Prepare data for plotting | |
new_data_points = [{'Agent': agent, 'x': position[0], 'y': position[1]} for agent, position in positions.items()] | |
new_data = pd.DataFrame(new_data_points) | |
# Create a new Plotly figure for the scatter plot, using Agent names for color distinction | |
fig = px.scatter(new_data, x='x', y='y', color='Agent', title="Agent Positions") | |
# Update figure layout | |
fig.update_layout(xaxis_title='X Axis', yaxis_title='Y Axis', autosize=True, xaxis=dict(range=[-5, 5]), yaxis=dict(range=[-5, 5])) | |
# Update traces to adjust the appearance of the dots, setting radius to 10 (size 20 for visual effect) | |
fig.update_traces(marker=dict(size=20)) | |
# Display the figure in the right column | |
chart_placeholder.plotly_chart(fig, use_container_width=True) | |
# Clear previous data display and show new data for the current frame | |
data_display = "" | |
for column_name, value in row.drop('positions').items(): | |
data_display += f"**{column_name}:** {value}\n\n" | |
data_placeholder.markdown(data_display) | |
# Increment the frame index to display the next set of positions | |
current_frame += 1 | |
# Use the slider value for the sleep duration | |
time.sleep(st.session_state['animation_speed']) |