Spaces:
Build error
Build error
Download app.py from string-sg/situatelearning: direct link, hf CLI and curl.
- Browser
- Download file 6.42 kB
-
https://huggingface.co/spaces/string-sg/situatelearning/resolve/main/app.py
- Command line
-
hf download hf://spaces/string-sg/situatelearning/app.py
-
curl -L -o app.py https://huggingface.co/spaces/string-sg/situatelearning/resolve/main/app.py
6.42 kB
| import streamlit as st | |
| from groq import Groq | |
| import streamlit.components.v1 as components | |
| from st_copy_to_clipboard import st_copy_to_clipboard | |
| import urllib.parse | |
| import os | |
| import uuid | |
| import html | |
| # check http proxy | |
| print("HTTP_PROXY:", os.getenv("HTTP_PROXY")) | |
| print("HTTPS_PROXY:", os.getenv("HTTPS_PROXY")) | |
| # Clear proxies if not required | |
| os.environ.pop("HTTP_PROXY", None) | |
| os.environ.pop("HTTPS_PROXY", None) | |
| # Streamlit page configuration | |
| st.set_page_config( | |
| page_title="Situate Learning", | |
| page_icon="๐", | |
| layout="centered" | |
| ) | |
| # Function to inject Google Analytics using st.components.v1.html | |
| def inject_ga(): | |
| try: | |
| GA_MEASUREMENT_ID = os.getenv("measurement_id") | |
| # Define the Google Analytics script | |
| GA_SCRIPT = f""" | |
| <!-- Google tag (gtag.js) --> | |
| <script async src="https://www.googletagmanager.com/gtag/js?id={GA_MEASUREMENT_ID}"></script> | |
| <script> | |
| window.dataLayer = window.dataLayer || []; | |
| function gtag(){{dataLayer.push(arguments);}} | |
| gtag('js', new Date()); | |
| gtag('config', '{GA_MEASUREMENT_ID}'); | |
| </script> | |
| """ | |
| # Inject the script into the app | |
| components.html(GA_SCRIPT, height=0) | |
| except KeyError: | |
| st.error("Google Analytics measurement ID not found in secrets.") | |
| # Inject Google Analytics dynamically | |
| inject_ga() | |
| # Initialize the Groq client | |
| GROQ_API_KEY = os.getenv("GROQ_API_KEY") | |
| # Ensure the API key is present | |
| if not GROQ_API_KEY: | |
| raise ValueError("GROQ_API_KEY environment variable is missing.") | |
| # Initialize the client with the API key | |
| client = Groq(api_key=GROQ_API_KEY) | |
| # monkey patch for 'proxies' error | |
| from groq._base_client import SyncHttpxClientWrapper | |
| original_init = SyncHttpxClientWrapper.__init__ | |
| def patched_init(self, **kwargs): | |
| kwargs.pop("proxies", None) # Remove 'proxies' if it exists | |
| original_init(self, **kwargs) | |
| SyncHttpxClientWrapper.__init__ = patched_init | |
| if "session_uuid" not in st.session_state: | |
| st.session_state.update({ | |
| "session_uuid": str(uuid.uuid4()), | |
| "teacher_input": "", | |
| "ai_response": "", | |
| "ga_initialized": False | |
| }) | |
| def log_event_to_ga(event_name, event_label="", value=""): | |
| event_script = f""" | |
| <script> | |
| gtag('event', '{event_name}', {{ | |
| 'event_category': 'User Interaction', | |
| 'event_label': '{html.escape(event_label)}', | |
| 'value': '{html.escape(value)}' | |
| }}); | |
| </script> | |
| """ | |
| if not st.session_state.get("ga_event_logged", False): | |
| st.markdown(event_script, unsafe_allow_html=True) | |
| st.session_state.ga_event_logged = True | |
| # Function to display the help modal | |
| # @st.dialog("Get Started", width="small") | |
| # def help_modal(): | |
| # st.write("Not braining today? Type in a simple concept to trigger a list of questions to better frame or close the lesson.") | |
| # st.markdown("For example:") | |
| # st.markdown("- *photosynthesis*") | |
| # st.markdown("- *algebra basics*") | |
| # st.markdown("- *moments (physics)*") | |
| # st.markdown("- *acids, salts and bases (chemistry)*") | |
| # st.markdown("- *price elasticity of demand*") | |
| # if st.button("Close Help"): | |
| # st.rerun() # Close the modal by triggering a script rerun | |
| # Streamlit Page Title | |
| st.title("๐ Situate Learning") | |
| # # Help/Get Started Button | |
| # if st.button("Help / Get Started"): | |
| # help_modal() # Open the help modal | |
| # Teacher input field | |
| st.markdown("### What did you teach today?") | |
| st.session_state.teacher_input = st.text_input( | |
| "Enter today's lesson or topic:", | |
| value=st.session_state.teacher_input, | |
| placeholder="e.g. photosynthesis or quadratic equations" | |
| ) | |
| # Function to generate higher-order thinking questions based on the lesson | |
| def generate_questions(lesson_text): | |
| """Generate higher-order thinking questions using Groq and Llama.""" | |
| try: | |
| messages = [ | |
| {"role": "system", "content": "You are an enthusiastic, curious teacher assistant creating thought-provoking questions."}, | |
| {"role": "user", "content": f"Teacher: {lesson_text} Can you create some engaging, higher-order thinking questions related to this topic? Include interdisciplinary questions."} | |
| ] | |
| response = client.chat.completions.create( | |
| model="llama-3.1-8b-instant", | |
| messages=messages | |
| ) | |
| ai_response = response.choices[0].message.content.strip() | |
| return ai_response | |
| except Exception as e: | |
| st.error(f"An error occurred: {e}") | |
| return "Sorry, we couldn't generate questions. Please try again later." | |
| # Button to generate questions | |
| if st.button("Generate Questions"): | |
| if st.session_state.teacher_input.strip(): | |
| # Log the user input to GA | |
| log_event_to_ga(st.session_state.teacher_input) | |
| # Generate higher-order thinking questions based on teacher's input | |
| st.session_state.ai_response = generate_questions(st.session_state.teacher_input) | |
| st.markdown(f"### Higher-Order Thinking Questions:") | |
| st.write(st.session_state.ai_response) | |
| else: | |
| st.warning("Please provide a topic or lesson before submitting.") | |
| # Function to copy response to clipboard | |
| def copy_to_clipboard_script(response): | |
| sanitized_response = html.escape(response).replace("\n", "\\n").replace("\r", "\\r") | |
| return f""" | |
| <script> | |
| function copyToClipboard() {{ | |
| navigator.clipboard.writeText("{sanitized_response}") | |
| .then(() => {{ | |
| alert('Copied to clipboard!'); | |
| }}) | |
| .catch(err => {{ | |
| console.error('Failed to copy: ', err); | |
| }}); | |
| }} | |
| </script> | |
| """ | |
| # Footer and Feedback Section | |
| # Check if AI response exists | |
| if st.session_state.ai_response: | |
| # Add the Copy to Clipboard button | |
| st_copy_to_clipboard( | |
| st.session_state.ai_response, # Text to copy | |
| ) | |
| st.markdown("---") | |
| # Feedback Link | |
| st.markdown( | |
| """ | |
| <div style='text-align: center;'> | |
| <a href="https://leekahhow.notion.site/14ac34bc89df803fbb5fc9b2922a62ea?pvs=105" target="_blank"> | |
| Provide Feedback | |
| </a> | |
| </div> | |
| """, unsafe_allow_html=True | |
| ) | |
| # Footer with Session ID | |
| st.markdown( | |
| f"<div style='text-align: center; color: grey;'>Session ID: {st.session_state.session_uuid}</div>", | |
| unsafe_allow_html=True | |
| ) |