import streamlit as st from dotenv import load_dotenv from app.workflows.til.analyse_til import TilCrew from app.workflows.til.analyse_til_v2 import AnalyseTilV2 from streamlit_extras.capture import stdout from app.workflows.utils.feedback import Feedback load_dotenv() def feedback_main(): page_bg_img = ''' ''' st.markdown(page_bg_img, unsafe_allow_html=True) st.markdown("
", unsafe_allow_html=True) st.markdown( """

Today I Learnt Feedback

Feedback on Today I Learnt

""", unsafe_allow_html=True ) default_content = ( "* Quantization is the process of reducing the size of LLM models by reducing the underlying weights.\n" "* The weights are reduced by scaling down the datatypes from a datatype that takes larger space to a data type that takes a smaller space, this is also known as downcasting.\n" "* Quantization offers benefits such as reduced storage space usage and faster computation.\n" "* Disadvantages: Answers are less precise\n" "* I learnt how to use Go Routines to handle concurrency in React.\n" ) if 'til_content' not in st.session_state: st.session_state.til_content = default_content til_content = st.text_area( 'Enter what you learnt today:', value=st.session_state.til_content, key='til_content', help='Enter what you learnt today' ) if st.button("Get Feedback"): with st.status( "🤖 **Analysing TIL...**", state="running", expanded=True ) as status: with st.container(height=500, border=False): log_container = st.empty() with stdout(log_container.code, terminator=""): feedback = AnalyseTilV2() inputs = {"content": til_content} results = feedback.kickoff(inputs=inputs) status.update( label="✅ Feedback ready!", state="complete", expanded=False, ) st.session_state.results = results st.session_state.run_id = results["run_id"] clear_feedback_state(results) if 'results' in st.session_state: results = st.session_state.results for result in results["til"]: st.markdown(f"#### TIL: {result['takeaway']}") st.markdown(f"**Feedback:** {result['feedback']}") if result['feedback'] == "not_ok": st.markdown(f"**Reason:** {result['reason']}") if result.get('suggestion') is not None: st.markdown(f"**Suggestion:** {result['suggestion']}") feedback_key = result['takeaway'].replace(' ', '_') feedback_given_key = f"{feedback_key}_feedback_given" if feedback_given_key not in st.session_state: st.session_state[feedback_given_key] = False if not st.session_state[feedback_given_key]: if st.button("helpful", key=f"helpful_{feedback_key}"): give_feedback(feedback_key, True) st.session_state[feedback_given_key] = True if st.button("not_helpful", key=f"not_helpful_{feedback_key}"): give_feedback(feedback_key, False) st.session_state[feedback_given_key] = True def give_feedback(feedback_key, is_helpful): run_id = st.session_state.run_id metric_type = "helpful" if is_helpful else "not_helpful" metric_score = 1 if is_helpful else 0 feedback_data = Feedback( metric_type=metric_type, metric_score=metric_score, feedback_on=feedback_key.replace('_', ' ').title() ) try: TilCrew.post_feedback(run_id, feedback_data) st.success("Feedback submitted successfully!") except Exception as e: st.error(f"Failed to submit feedback: {e}") st.session_state[f"{feedback_key}_feedback_given"] = True def clear_feedback_state(results): for key in st.session_state.keys(): if key.endswith("_feedback_given"): st.session_state[key] = False if __name__ == "__main__": feedback_main()